1 条题解
-
0
题外话
萌新一看题目一下就想到了用DP来做,打完,运行!提交!
……五分钟后,我重新开始审题题意
给定一个数串,和 个小数串,问这些小串都是不是大数字串的子序列。
思路
利用 vector 进行储存每一个值为 的位置,然后利用二分进行查找其中最小的一个能够大于前一个位置的位置。
说到底就是进行 次二分啦!
将每一个小串的每一个数字在原大串中进行查找,查找到第一个能够大于上一个位置 的位置,并进行保存。若找不到了,那么就输出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
信息
- ID
- 3748
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者