JZOJ 5048GDOI2017模拟一试4.11IQ测试
Posted gjy-juruo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JZOJ 5048GDOI2017模拟一试4.11IQ测试相关的知识,希望对你有一定的参考价值。
题目大意:
判断一个序列是否是另外一个序列删除若干个数字之后得到的。
正文:
我们可以定义两个指针,分别指向长序列和短序列。
拿样例来举例:
如果指针指的数相同,两个指针都往右跳:
如果不同,则指向长序列的指针往右跳:
以此类推。
超时,得分 ( exttt{30}) 分。
考虑将长序列每一个出现过的数的位置存起来,然后用二分找合适的位置。可以用 (vector) 来存,再用一个变量 (last) 记录短序列每一个数字在长序列出现的位置,二分时就可以找大于上一个数的 (last) 的最小的数。
代码:
bool flag = 1;
l = 0;
scanf ("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf ("%d", &x);
if(f[x].empty())
flag = 0;
if(!flag)
continue;
it = upper_bound(f[x].begin(), f[x].end(), l);
if(it == f[x].end()) flag = 0;
l = *it;
}
if(flag) puts("TAK");
else puts("NIE");
以上是关于JZOJ 5048GDOI2017模拟一试4.11IQ测试的主要内容,如果未能解决你的问题,请参考以下文章
GDOI2020模拟4.11赢家(winner) (计数dp+容斥)
JZOJ4419GDOI2016模拟4.2hole(四~三维偏序问题)
[jzoj 6084] [GDOI2019模拟2019.3.25] 礼物 [luogu 4916] 魔力环 解题报告(莫比乌斯反演+生成函数)