记录编号 248716 评测结果 AAAAAAAAAA
题目名称 黑心买卖 最终得分 100
用户昵称 GravatarFancy 是否通过 通过
代码语言 C++ 运行时间 1.805 s
提交时间 2016-04-10 23:04:51 内存使用 11.35 MiB
显示代码纯文本
#include<cstdio>
using namespace std;
const int N=200001;
const int M=1000050;
int n,m,tot,ecnt,a[N],fa[N],no[N],head[N],to[M],next[M];
bool used[N],ans[N];
inline int father(int x)
{
	return fa[x]==x?x:fa[x]=father(fa[x]);
}
int main()
{
	freopen("closing.in","r",stdin);
	freopen("closing.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1,x,y;i<=m;i++)
	{
		scanf("%d%d",&x,&y);
		to[++ecnt]=y;next[ecnt]=head[x];head[x]=ecnt;
		to[++ecnt]=x;next[ecnt]=head[y];head[y]=ecnt;
	}
	for(int i=1;i<=n;i++) fa[i]=i,scanf("%d",&a[i]);
	for(int i=n,x;i;i--)
	{
		x=a[i];
		used[x]=1;no[++tot]=x;
		for(int j=head[x],y=to[j];j;j=next[j],y=to[j])
		  if(used[y]) fa[father(x)]=father(y);
		for(int j=1;j<=tot;j++)
		  if(father(no[j])==father(a[n])) no[j]=no[tot],tot--,j--;
		ans[i]=!tot;
	}
	for(int i=1;i<=n;i++)
	  if(ans[i]) printf("YES\n");
	  else printf("NO\n");
}