本文主要是介绍思路题+vetor/链表--bzoj2083: [Poi2010]Intelligence test,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
传送门
solution:
先把询问离线下来,把所有未匹配完的序列的当前未匹配那一位挂在对应数值的链表上。然后遍历原序列,每次把这个数值的链表遍历一下,把所有的序列都推进一个,把这个链表清空,然后把下一个再挂到对应数值的链表上,最后看是否推进到序列尾就好了
注意不能边清空边挂,因为可能挂在同一个上,存下来就好了
因为不太会这道题的链表就写了 v e c t o r q w q vector\ qwq vector qwq
如果有小伙伴会的话教教窝 q u q quq quq
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#define maxn 1000005
using namespace std;
int n,m,a[maxn],len[maxn],f[maxn],g[maxn];
vector<int> vec[maxn],b[maxn];inline int rd(){int x=0,f=1;char c=' ';while(c<'0' || c>'9') f=c=='-'?-1:1,c=getchar();while(c<='9' && c>='0') x=x*10+c-'0',c=getchar();return x*f;
}int main(){m=rd();for(int i=1;i<=m;i++) a[i]=rd();n=rd();for(int i=1;i<=n;i++){len[i]=rd();for(int j=1;j<=len[i];j++){int x=rd(); b[i].push_back(x);}if(len[i]) vec[b[i][0]].push_back(i);}for(int i=1;i<=m;i++){int cnt=0;for(int j=0;j<vec[a[i]].size();j++){int x=vec[a[i]][j];f[x]++; g[++cnt]=x;}vec[a[i]].clear();for(int j=1;j<=cnt;j++)if(f[g[j]]<len[g[j]])vec[b[g[j]][f[g[j]]]].push_back(g[j]);}for(int i=1;i<=n;i++)if(f[i]==len[i]) puts("TAK");else puts("NIE");return 0;
}
这篇关于思路题+vetor/链表--bzoj2083: [Poi2010]Intelligence test的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!