BZOJ 2083: [Poi2010]Intelligence test

时间:2024-10-28 19:05:51

Description

问一个序列是不是起始序列的子序列.

Sol

二分.

直接维护每个数出现的位置,二分一个最小的就行.

Code

/**************************************************************
Problem: 2083
User: BeiYu
Language: C++
Result: Accepted
Time:7024 ms
Memory:34132 kb
****************************************************************/ #include <bits/stdc++.h>
using namespace std; #define debug(a) cout<<#a<<"="<<a<<" "
const int N = 1e6+50; int n;
vector< int > a[N]; inline int in(int x=0,char ch=getchar()) { while(ch>'9' || ch<'0') ch=getchar();
while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();return x; }
int main() {
n=in();
for(int i=1,x;i<=n;i++) x=in(),a[x].push_back(i);
for(int i=1;i<N;i++) a[i].push_back(n+1);
for(int T=in();T--;) {
int m=in(),pos=0,f=0;vector< int > :: iterator it;
for(int i=1,x;i<=m;i++) {
x=in();
if(f) continue;
it=upper_bound(a[x].begin(),a[x].end(),pos);
if(*it!=n+1) pos=*it;
else f=1;
// debug(pos),debug(f)<<endl;
}
if(f) puts("NIE");
else puts("TAK");
}
return 0;
}