2083: [Poi2010]Intelligence test
Time Limit: 10 Sec Memory Limit:259 MBSubmit: 545 Solved: 279
[Submit][Status][Discuss]
Description
霸中智力测试机构的一项工作就是按照一定的规则删除一个序列的数字,得到一个确定的数列。Lyx很渴望成为霸中智力测试机构的主管,但是他在这个工作上做的并不好,俗话说熟能生巧,他打算做很多练习,所以他希望你写一个程序来快速判断他的答案是否正确。
Input
第一行为一个整数m(1<=m<=1000000)第二行包括m个用空格分开的整数ai(1<=ai<=1000000),组成了最初的序列,第三行为一个整数n(1<=n<=1000000),表示n个Lyx经过一系列删除得到的序列,每个序列两行,第一行给出长度L(1<=L<=m),然后下一行为L个由空格分开的整数bi(1<=bi<=1000000)。
Output
共n行,如果Lyx的序列确实是由最初的序列删除一些数得到,就输出TAK,否则输出NIE。
Sample Input
7
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
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
TAK
NIE
TAK
NIE
NIE
TAK
NIE
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<vector>
using namespace std;
const int N=1000005;
vector<int>wz[N];
int num[N],len[N],a[N],n,m,x,l,r,q,mid;
inline int ef(int key){
l=0;r=len[key]-1;q=-1;
while (l<=r){
mid=(l+r)>>1;
if (wz[key][mid]>x){q=wz[key][mid];r=mid-1;}
else l=mid+1;
}
return q;
}
inline bool judge(){
x=0;
for (int i=1;i<=n;++i){
x=ef(a[i]);
if (x==-1)return false;
}
return true;
}
int main (){
scanf ("%d",&n);
for (int i=1;i<=n;++i){
scanf ("%d",&num[i]);
wz[num[i]].push_back(i);
len[num[i]]++;
}
scanf ("%d",&m);
for (int i=1;i<=m;++i){
scanf ("%d",&n);
for (int j=1;j<=n;++j)
scanf ("%d",&a[j]);
if (judge())puts("TAK");
else puts("NIE");
}
return 0;
}

本文介绍了一道名为[Poi2010]Intelligencetest的算法题目,主要涉及序列处理及验证子序列的存在性。输入包含初始序列与待验证序列,通过程序判断待验证序列是否为原始序列的子序列。
793

被折叠的 条评论
为什么被折叠?



