这题一看就是LCA,LCA呢,但是毁灭的状态具有后效性,所以! 我们可以反着来。#include<map> #include<queue> #include<cmath> #include<cctype> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define qread(x) x=read() #define mes(x,y) memset(x,y,sizeof(x)) #define mpy(x,y) memcpy(x,y,sizeof(x)) #define Maxm 200000 #define INF 2147483647 #define eps 1e-6 inline int read(){ char ch=getchar(); int f=1,x=0; while(!(ch>='0'&&ch<='9')){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+(ch-'0');ch=getchar();} return x*f; } struct Edge{ int x,y,next; }E[Maxm+1];int len,first[2*Maxm+1]; void ins(int x,int y){ len++;E[len].x=y;E[len].next=first[x];first[x]=len; len++;E[len].x=x;E[len].next=first[y];first[y]=len; } int sum,ans[2*Maxm+1],f[2*Maxm+1],fa[2*Maxm+1],b[2*Maxm+1],v[2*Maxm+1]; int findfa(int x){ if(x==fa[x])return fa[x]; return fa[x]=findfa(fa[x]); } void add(int x){ int fx=findfa(x); for(int k=first[x];k>0;k=E[k].next){ if(v[E[k].x]==true){ int fy=findfa(E[k].x); if(fx!=fy){ fa[fy]=x;sum--; } } } } int n,m,k,x,y; int main(){ qread(n);qread(m); len=0;mes(first,0); for(int i=1;i<=m;i++){ qread(x);qread(y); ins(x,y); } qread(k); mes(b,false);mes(v,false); for(int i=0;i<n;i++)fa[i]=i; for(int i=1;i<=k;i++){ qread(f[i]); b[f[i]]=true; } sum=0; for(int i=0;i<n;i++){ if(b[i]==false){ sum++;add(i); v[i]=true; } } ans[k+1]=sum; for(int i=k;i>0;i--){ sum++; add(f[i]); v[f[i]]=true; ans[i]=sum; } for(int i=1;i<=k+1;i++)printf("%d\n",ans[i]); }
查看原文:http://hz2016.tk/blog/?p=69
[JSOI2008]星球大战starwar
最新推荐文章于 2020-05-29 16:19:34 发布