Description
Input
Output
Sample Input
1 5 4 5 7 8 6
4
5
1 5 5 8 6
3
2 2 2
3
5 7 8
4
1 5 7 4
Sample Output
NIE
TAK
NIE
题解:
题目大意为给定n个数,每次给定一个序列,问这个序列是否为给定的原序列的一个子序列(不要求连续)。
这道题很容易想到二分。按照权值做一个vector,每次来一个新数,判断数在序列的位置并记录下last(因为序列是有顺序的),如果找不到,就返回false
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
const int MAXN=1000001;
int a[MAXN];
vector <int> S[MAXN];
vector <int> ::iterator it;
int main(int argc, char *argv[])
{
int n,i,j,x,m,l,r,mid,len,t,last;
bool flag;
scanf("%d",&m);
for(i=1;i<=m;i++)
scanf("%d",&a[i]),S[a[i]].push_back(i);
scanf("%d",&n);
for(i=1;i<=n;i++)
{
flag=true;
scanf("%d",&len);
l=0,r=m,last=0;
for(j=1;j<=len;j++)
{
scanf("%d",&x);
if(flag==false) continue;
if(S[x].empty()) {
flag=false;
continue;
}
it=upper_bound(S[x].begin(),S[x].end(),last);
if(it==S[x].end()) flag=false;
last=*it;
}
if(flag==false) printf("NIE\n");
else printf("TAK\n");
}
return 0;
}