【bzoj2083】 POI2010Intelligence test 乱搞

貌似这么水的一道题调很久不应该吧,但是我做到了,表示不会STL自带的vector的二分,于是手写的。

就是开一个vector记录一下每个元素出现的位置,然后每进来一个元素,就在vector里二分找是否有可行的位置了。

数据范围什么鬼?!


#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#define inf 1000000000
#define maxn 1000010

using namespace std;

vector<int> q[maxn];
int n,T,m,mx;

int query(int i,int y)
{
	int l=0,r=q[i].size()-1,ans=0;
	while (l<=r)
	{
		int mid=(l+r)/2;
		if (q[i][mid]>y) ans=mid,r=mid-1; else l=mid+1;
	}
	return ans;
}

int main()
{
	scanf("%d",&n);
	for (int i=1;i<=n;i++)
	{
		int x;
		scanf("%d",&x);
		q[x].push_back(i);
		mx=max(mx,x);
	}
	for (int i=1;i<=mx;i++) if (q[i].size()) q[i].push_back(inf);
	scanf("%d",&T);
	while (T--)
	{
		scanf("%d",&m);
		bool w=1;
		int last=0,pos;
		for (int i=1;i<=m;i++)
		{
			int x;
			scanf("%d",&x);
			if (!w) continue;
			if (q[x].size())
			{
				pos=query(x,last);
				if (pos==q[x].size()-1) w=0;
				last=q[x][pos];
			}
			else w=0;
		}
		if (w) printf("TAK\n"); else printf("NIE\n");
	}
	return 0;
}


你可能感兴趣的:(【bzoj2083】 POI2010Intelligence test 乱搞)