30分求调
查看原帖
30分求调
575994
Hisaishi_Kanade楼主2022/7/15 14:08
#include <stdio.h>
int f[500005];
int n,k,x,y,opt,i,ans;
inline int find(int x){
	while(x!=f[x])
		x=f[x]=f[f[x]];
	return x;
}
int main(){
	scanf("%d %d",&n,&k);
	n*=3;
	for(i=1;i<=n;++i)
		f[i]=i;
	n/=3;
	while(k--){
		scanf("%d %d %d",&opt,&x,&y);
		if(x>n||y>n)
			++ans;
		else
			if(opt==1)
				if(find(x+n)==find(y)||find(x)==find(y+n))
					++ans;
				else{
					f[find(x)]=find(y);
					f[find(x+n)]=find(y+n);
					f[find(x+(n<<1))]=f[find(y+n<<1)];
				}
			else
				if(find(x)==find(y)||find(x)==find(y+n))
					++ans;
				else{
					f[find(x)]=find(y+(n<<1));
					f[find(x+n)]=find(y);
					f[find(x+(n<<1))]=find(y+n);
				}
	}
	printf("%d",ans);
	return 0;
}

感觉这就是种类并查集板子题,不知道哪里写挂了。

2022/7/15 14:08
加载中...