1 条题解

  • 0
    @ 2026-9-26 16:44:32

    题外话

    萌新一看题目一下就想到了用DP来做,打完,运行!提交!
    ……五分钟后,我重新开始审题

    题意

    给定一个数串,和 mm 个小数串,问这些小串都是不是大数字串的子序列。

    思路

    利用 vector 进行储存每一个值为 aiai 的位置,然后利用二分进行查找其中最小的一个能够大于前一个位置的位置。
    说到底就是进行 m×Lm \times L 次二分啦!
    将每一个小串的每一个数字在原大串中进行查找,查找到第一个能够大于上一个位置 laslas 的位置,并进行保存。若找不到了,那么就输出 NIE。若全部找到了,那么输出 TAK。
    因为二分要保证数据有序,那么我们可以用一个 vector 保存位置,那么就太简单了,对吧!

    Code

    #include<bits/stdc++.h>
    using namespace std;
    int n,i,j,bao,las,x,y,a[1200100],flag,mid,t,w,m;
    vector<int> f[1200100];
    int main(){
    	scanf("%d",&n);
    	for (i=1;i<=n;i++) scanf("%d",&a[i]),f[a[i]].push_back(i);
    	scanf("%d",&m);
    	for (i=1;i<=m;i++){
    		scanf("%d",&x);las=-1;
    		flag=true;
    		for (j=1;j<=x;j++){
    			scanf("%d",&y);
    			t=0;w=f[y].size()-1;bao=-1;
    			while (t<=w){
    				mid=(t+w)/2;
    				if (f[y][mid]>las) bao=mid,w=mid-1;
    				else t=mid+1;
    			}
    			if (bao==-1) flag=false;
    			else las=f[y][bao];
    		}
    		if (flag) printf("TAK\n");
    		else printf("NIE\n");
    	}
    	return 0;
    }
    
    
    • 1

    [POI 2010] TES-Intelligence Test智力测验

    信息

    ID
    3748
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者