记录编号 |
248650 |
评测结果 |
AAAAAAAAAA |
题目名称 |
黑心买卖 |
最终得分 |
100 |
用户昵称 |
/k |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
1.645 s |
提交时间 |
2016-04-10 18:05:03 |
内存使用 |
8.95 MiB |
显示代码纯文本
- #include<iostream>
- #include<cstdio>
- #include<vector>
- using namespace std;
- int f[200010],n,m;
- struct u
- {
- int b;
- int x;
- }c[1000010];
- int h[200010];
- bool b[200010];
- int l;
- int in[200010];
- int sum;
- int s[200010];
- int gf(int a)
- {
- if(f[a]==a)
- return a;
- f[a]=gf(f[a]);
- return f[a];
- }
- inline void gjj(int a,int b)
- {
- a=gf(a),b=gf(b);
- f[a]=b;
- s[b]+=s[a];
- }
- inline int gj(int a,int b)
- {
- c[++l].b=b;
- c[l].x=h[a];
- h[a]=l;
- }
- int main()
- {
- freopen("closing.in","r",stdin);
- freopen("closing.out","w",stdout);
- scanf("%d%d",&n,&m);
- for(int i=1;i<=m;i++)
- {
- int aa,bb;
- scanf("%d%d",&aa,&bb);
- gj(aa,bb);
- gj(bb,aa);
- }
- for(int i=1;i<=n;i++)
- {
- scanf("%d",&in[i]);
- f[i]=i;
- }
- for(int j=n;j>=1;j--)
- {
- sum++;
- int k=in[j];
- s[k]=1;
- for(int i=h[k];i;i=c[i].x)
- {
- int u=c[i].b;
- if(s[u])
- if(gf(k)!=gf(u))
- {
- //printf("O");
- gjj(k,u);
- }
- }
- //printf("%d\n",s[1]);
- if(sum==s[gf(k)])
- b[j]=1;
- }
- for(int i=1;i<=n;i++)
- if(b[i])
- puts("YES");
- else
- puts("NO");
- getchar();
- getchar();
- }