90分 #9 TLE 石山代码求调
查看原帖
90分 #9 TLE 石山代码求调
786210
wanghq123楼主2024/9/8 15:28
#include<bits/stdc++.h>
using namespace std;
const int M=2e5+5;
int n,m,k,sum,tot,cnt;
int a[M],fa[M],head[M],ans[M];
bool b[M];
struct E{
	int nxt,to,from;
}ed[M*2]; 

void add(int x,int y){
	ed[++tot]=E{head[x],y,x};
	head[x]=tot;
}

int find(int x){
	return x==fa[x]?x:fa[x]=find(fa[x]);
}

int uni(int u,int v){
	int p=find(u);
	int q=find(v);
	if(p==q) return 0;
	fa[p]=q;
	sum--;
	return 1;
}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin>>n>>m;
	memset(head,-1,sizeof(head));
	for(int i=0;i<n;i++) fa[i]=i;
	for(int i=1,x,y;i<=m;i++){
		cin>>x>>y;
		add(x,y),add(y,x);
	}
	cin>>k;
	sum=n-k;
	for(int i=1;i<=k;i++)
		cin>>a[i],b[a[i]]=1;
	for(int i=0;i<2*m;i++)
		if(!b[ed[i].from]&&!b[ed[i].to])
			uni(ed[i].from,ed[i].to);	
	ans[++cnt]=sum;
	for(int i=k;i>=1;i--){
		int u=a[i];
		sum++;
		b[u]=0;
		for(int i=head[u];i!=-1;i=ed[i].nxt){
			int v=ed[i].to;
			if(!b[v])
			uni(u,v);
		}
		ans[++cnt]=sum;
	}
	for(int i=cnt;i>=1;i--) cout<<ans[i]<<endl;
	return 0;
}
2024/9/8 15:28
加载中...