1 条题解

  • 0
    @ 2025-9-10 16:05:43

    這道題考慮正反則難

    既然斷掉一個點不好搞,那麼我們就反方向來,每次加一個點,用並查集統計答案即可

    #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
    上传者