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;
}