BZOJ 2083: [Poi2010]Intelligence test
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; }