二分
思路
记录每个数出现的位置,然后二分。
代码
//By AcerMo
#include<cmath>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int M=1005000;
int n,m,e,a[M],b[M];
vector<int>v[M];
inline void read(int &x)
{
x=0;char ch=getchar();
while (!isdigit(ch)) ch=getchar();
while (isdigit(ch)) x=x*10+ch-'0',ch=getchar();
return ;
}
signed main()
{
read(m);
for (int i=1;i<=m;i++)
read(a[i]),v[a[i]].push_back(i);
read(e);
while (e--)
{
read(n);int la=0,fl=1;
for (int i=1;i<=n;i++) read(b[i]);
for (int i=1;i<=n;i++)
{
int sz=v[b[i]].size();
if (sz==0){fl=0;break;}
if (v[b[i]][sz-1]<=la){fl=0;break;}
int l=0,r=sz-1;
while (l<r)
{
int mid=(l+r)>>1;
if (v[b[i]][mid]>=la) r=mid;
else l=mid+1;
}
la=v[b[i]][l];
}
if (fl) puts("TAK");
else puts("NIE");
}
return 0;
}