1. 程式人生 > >bzoj 2083 [Poi2010]Intelligence test——思路+vector/連結串列

bzoj 2083 [Poi2010]Intelligence test——思路+vector/連結串列

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

給每個值開一個vector。每個詢問掛在其第一個值上;然後列舉給定序列,遇到一個值就訪問那個值的vector,把裡面的詢問序列都向前推進一位,掛在新的值的vector裡。

注意不要一邊消一邊掛,因為可能消的和掛的是同一個值;只要臨時存一下就行了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using
namespace std; const int N=1e6+5; int n,m,a[N],len[N],p[N],top; vector<int> b[N],w[N]; pair<int,int> sta[N]; int rdn() { int ret=0;bool fx=1;char ch=getchar(); while(ch>'9'||ch<'0'){if(ch=='-')fx=0;ch=getchar();} while(ch>='0'&&ch<='9') ret=(ret<<3)+(ret<<1
)+ch-'0',ch=getchar(); return fx?ret:-ret; } int main() { m=rdn();for(int i=1;i<=m;i++)a[i]=rdn(); n=rdn(); for(int i=1;i<=n;i++) { len[i]=rdn(); for(int j=1,d;j<=len[i];j++) d=rdn(),b[i].push_back(d); p[i]=0; w[b[i][p[i]]].push_back(i); } for(int
i=1;i<=m;i++) { int d=w[a[i]].size();top=0; for(int j=d-1;j>=0;j--) { int k=w[a[i]][j]; w[a[i]].pop_back(); p[k]++; if(p[k]==len[k])continue; int c=b[k][p[k]]; sta[++top]=make_pair(c,k); } for(int i=1;i<=top;i++) w[sta[i].first].push_back(sta[i].second); } for(int i=1;i<=n;i++) puts(p[i]==len[i]?"TAK":"NIE"); return 0; }