1 条题解
-
0
這道題考慮正反則難
既然斷掉一個點不好搞,那麼我們就反方向來,每次加一個點,用並查集統計答案即可
#include<iostream> #include<cstdio> #include<vector> #include<map> using namespace std; bool Test_MLE_start; constexpr int N=5*1e5+10; int _=1,n,m,k,now=0,cnt=0,f[N],ans[N],del[N]; struct edge{int u,v;}a[N]; map<int,bool> mp;vector<int> ve[N]; inline int reads(){ char c=getchar(); int sum=0,f=1; while(!isdigit(c)){ if(c=='-') f=-1; c=getchar(); } while(isdigit(c)){ sum=(sum<<3)+(sum<<1)+(c^'0'); c=getchar(); } return sum*f; } inline void files(){ freopen("B.in","r",stdin); freopen("std.out","w",stdout); } inline void clr(){ // Don't forget! } int finds(int x){return f[x]==x?x:f[x]=finds(f[x]);} void merges(int x,int y){f[finds(x)]=finds(y);} bool Test_MLE_end; signed main(){ // printf("%lf Mb\n",(&Test_MLE_end-&Test_MLE_start-1)/1024.0/1024.0); // files(); // _=reads(); while(_--){ clr();n=reads(),m=reads();for(int i=0;i<n;i++) f[i]=i; for(int i=1;i<=m;i++) a[i].u=reads(),a[i].v=reads(),ve[a[i].u].push_back(a[i].v),ve[a[i].v].push_back(a[i].u); k=reads();for(int i=1;i<=k;i++) del[i]=reads(),mp[del[i]]=1; for(int i=1;i<=m;i++){ if(mp[a[i].u]||mp[a[i].v]) continue; merges(a[i].u,a[i].v); } for(int i=0;i<n;i++){ if(f[i]==i&&!mp[i]) now++; } ans[++cnt]=now; for(int i=k;i>=1;i--){ now++;mp[del[i]]=0; for(auto j:ve[del[i]]){ if(mp[j]) continue; if(finds(del[i])!=finds(j)) now--; merges(del[i],j); } ans[++cnt]=now; } for(int i=cnt;i>=1;i--) printf("%d\n",ans[i]); } return 0; }
- 1
信息
- ID
- 385
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- (无)
- 递交数
- 11
- 已通过
- 9
- 上传者