10分 qaq
查看原帖
10分 qaq
338786
mushroom_knight楼主2021/1/20 19:39

RT,写了个普通的并查集……

结果交上去WA了9个点。

求神仙看一看。


#include<bits/stdc++.h>
using namespace std;

const int si=20000+10;
int n,p;
int m,q;
int pa[2][si];
int size_[2][si];
int f[2][si];

int root(int pos,int x){
	if(pa[pos][x]!=x){
		return pa[pos][x]=root(pos,pa[pos][x]);
	}
	return pa[pos][x];
}

void Union(int pos,int x,int y){
	int rx=root(pos,x),ry=root(pos,y);
	if(rx==ry){
		return;
	}
	if(size_[pos][rx]>=size_[pos][ry]){
		pa[pos][ry]=rx;size_[pos][rx]+=size_[pos][ry];
	}
	else{
		pa[pos][rx]=ry,size_[pos][ry]+=size_[pos][rx];
	}
}

int ans1,ans2;

void sol(){
	for(register int i=1;i<=max(n,m);++i){
		if(root(0,f[0][i])){
			++ans1;
		}
		if(root(1,f[1][i])){
			++ans2;
		}
	}
	cout<<min(ans1,ans2);
}

int main(){
	scanf("%d%d%d%d",&n,&m,&p,&q);
	for(register int i=1;i<=3*max(n,m);++i){
		pa[0][i]=pa[1][i]=i;
		size_[0][i]=size_[1][i]=1;
	}
	for(register int i=1;i<=p;++i){
		int x,y;
		scanf("%d%d",&x,&y);
		f[0][i]=x,f[0][i]=y;
		Union(0,x,y);
	}
	for(register int i=1;i<=q;++i){
		int x,y;
		scanf("%d%d",&x,&y);
		f[1][i]=-x+n,f[1][i]=-y+n;
		Union(1,-x+n,-y+n);
	}
	sol();
	return 0;
}

2021/1/20 19:39
加载中...