记录编号 |
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();
}