比赛 ZLXSCDay2 评测结果 AAAAAAAAAA
题目名称 黑心买卖 最终得分 100
用户昵称 /k 运行时间 1.926 s
代码语言 C++ 内存使用 10.06 MiB
提交时间 2016-04-10 17:46:48
显示代码纯文本
#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();
}