v[x]记录了x值的出现位置序列。
对每个b中的元素,每次在v[b[i]]中二分。
因此要记录上一次二分到了a数组的哪个位置。
#include<cstdio> #include<vector> #include<algorithm> using namespace std; #define N 1000001 vector<int>v[N]; int x,m,n,b[N]; int main() { scanf("%d",&n); for(int i=1;i<=n;++i) { scanf("%d",&x); v[x].push_back(i); } scanf("%d",&m); for(;m;--m) { scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%d",&b[i]); int last=0; for(int i=1;i<=n;++i) { vector<int>::iterator it=upper_bound(v[b[i]].begin(),v[b[i]].end(),last); if(it==v[b[i]].end()) { puts("NIE"); goto FAIL; } last=*it; } puts("TAK"); continue; FAIL:; } return 0; }