题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2083

先把所有子序列都存下来,总长度应该有限制,所以用 vector 存;

要做到 O(n),就得遍历原序列的同时匹配所有子序列;

注意到,遍历原序列,一个位置上只有一个值(当然啦);

所以考虑这一个值能否推进子序列的匹配,就需要知道每个子序列下一步需要的值是多少;

再换个角度,在每个值上挂一个 vector,存需要这个值的子序列有哪些;

然后遍历到这个位置,就把它的值上挂的所有子序列的匹配都推进1步,匹配完就是可行的;

思路很好的一道题!

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define pb push_back
using namespace std;
int const xn=1e6+;
int m,n,a[xn],l[xn];
bool ok[xn];
struct N{int x,y;};
vector<int>b[xn];
vector<N>v[xn],sta;
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return f?ret:-ret;
}
int main()
{
m=rd();
for(int i=;i<=m;i++)a[i]=rd();
n=rd();
for(int i=;i<=n;i++)
{
l[i]=rd();
for(int j=,x;j<=l[i];j++)x=rd(),b[i].pb(x);
int y=b[i][]; v[y].pb((N){i,});
}
for(int i=;i<=m;i++)
{
int y=a[i]; sta.clear();
for(int j=;j<v[y].size();j++)
{
N t=v[y][j];
if(t.y==l[t.x])ok[t.x]=;
else sta.pb((N){t.x,t.y+});
}
v[y].clear();
for(int j=;j<sta.size();j++)
{
N t=sta[j];
v[b[t.x][t.y-]].pb(t);//b:0~l-1
}
}
for(int i=;i<=n;i++)
{
if(ok[i])puts("TAK");
else puts("NIE");
}
return ;
}

bzoj 2083 Intelligence test —— 思路+vector的更多相关文章

  1. bzoj 2083 [Poi2010]Intelligence test——思路+vector/链表

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2083 给每个值开一个vector.每个询问挂在其第一个值上:然后枚举给定序列,遇到一个值就访 ...

  2. BZOJ 2083 Intelligence test

    用vector,二分. #include<iostream> #include<cstdio> #include<cstring> #include<algo ...

  3. BZOJ 2083: [Poi2010]Intelligence test [vector+二分]

    2083: [Poi2010]Intelligence test Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 469  Solved: 227[Su ...

  4. BZOJ 2083 vector的巧用+二分

    2083: [Poi2010]Intelligence test Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 469  Solved: 227[Su ...

  5. BZOJ 2083: [Poi2010]Intelligence test

    Description 问一个序列是不是起始序列的子序列. Sol 二分. 直接维护每个数出现的位置,二分一个最小的就行. Code /******************************** ...

  6. bzoj 2083: [Poi2010]Intelligence test——vecto+二分

    Description 霸中智力测试机构的一项工作就是按照一定的规则删除一个序列的数字,得到一个确定的数列.Lyx很渴望成为霸中智力测试机构的主管,但是他在这个工作上做的并不好,俗话说熟能生巧,他打算 ...

  7. [BZOJ 2083] [POI 2010] Intelligence test

    Description 霸中智力测试机构的一项工作就是按照一定的规则删除一个序列的数字,得到一个确定的数列.Lyx很渴望成为霸中智力测试机构的主管,但是他在这个工作上做的并不好,俗话说熟能生巧,他打算 ...

  8. BZOJ 3252: 攻略(思路题)

    传送门 解题思路 比较好想的一道思路题,结果有个地方没开\(long\) \(long\) \(wa\)了三次..其实就是模仿一下树链剖分,重新定义重儿子,一个点的重儿子为所有儿子中到叶节点权值最大的 ...

  9. BZOJ.1071.[SCOI2007]组队(思路)

    题目链接 三个限制: \(Ah-AminH+Bv-BminV\leq C\ \to\ Ah+Bv\leq C+AminH+BminV\) \(v\geq minV\) \(h\geq minH\) 记 ...

随机推荐

  1. Linux使用screen实现关闭ssh连接的情况下,让程序继续在后台运行

    Ubuntu默认没有安装screen,需要手动安装. 安装命令: sudo apt-get install screen 简单的操作方法: 直接输入命令 screen 进入screen子界面,此时pu ...

  2. js long类型的日期转成Date,字符串StringBuilder拼接

    longToDate.js //扩展Date的format方法 Date.prototype.format = function (format) { var o = { "M+" ...

  3. 使用uilabel重新自调整高度后显示横线和竖线问题

    这个使用uilabel自调节高度发现的问题,代码如下: //content label                        NSString *contentValue = ((Messag ...

  4. Docker 基础底层架构浅谈

    docker学习过程中,免不了需要学习下docker的底层技术,今天我们来记录下docker的底层架构吧! 从上图我们可以看到,docker依赖于linux内核的三个基本技术:namespaces.C ...

  5. Map与object的区别

    Map 对象保存键值对.任何值(对象或者原始值) 都可以作为一个键或一个值. 语法 new Map([iterable]) 参数 iterable Iterable 可以是一个数组或者其他 itera ...

  6. VisualSVN Server 导入已存在的库

    http://blog.csdn.net/lidatgb/article/details/7984220         早些时候建立过一个SVN Server的库,后来觉得库的名字太长了,随意换了一 ...

  7. BUPT复试专题—众数(2014)

    题目描述 有一个长度为N的非降数列,求数列中出现最多的数,若答案不唯一输出最小的数 输入 第一行T表示测试数据的组数(T<100) 对于每组测试数据: 第一行是一个正整数N表示数列长度 第二行有 ...

  8. BUPT复试专题—查找(2011)

    https://www.nowcoder.com/practice/d93db01c2ee44e8a9237d63842aca8aa?tpId=67&tqId=29646&tPage= ...

  9. 如何正确地在React中处理事件

    1.构造器内绑定this class MyComponent extends React.Component { constructor(props) { super(props); this.sta ...

  10. 深入JVM系列(二)之GC机制、收集器与GC调优(转)

    一.回顾JVM内存分配   需要了解更多内存模式与内存分配的,请看 深入JVM系列(一)之内存模型与内存分配 1.1.内存分配: 1.对象优先在EDEN分配2.大对象直接进入老年代 3.长期存活的对象 ...