倒着处理删点,就变成了加点,于是并查集。
#includeusing namespace std;#define N 400001int fa[N],kill[N],rank[N],n,m,q;bool hav[N];int next[N],first[N],v[N],en,x,y,anss[N],cnt;void AddEdge(int U,int V){ v[++en]=V; next[en]=first[U]; first[U]=en;}int find(int x){ if(x==fa[x]) return x; fa[x]=find(fa[x]); return fa[x];}void Union(int U,int V){ --cnt; if(rank[U] =1;--i) { anss[i]=cnt-i; for(int j=first[kill[i]];j;j=next[j]) if(!hav[v[j]]) { int f1=find(kill[i]),f2=find(v[j]); if(f1!=f2) Union(f1,f2); } hav[kill[i]]=0; } anss[0]=cnt; for(int i=0;i<=q;++i) printf("%d\n",anss[i]); return 0;}