60分求助!
查看原帖
60分求助!
110319
LYR_楼主2020/7/16 17:28
#include <bits/stdc++.h>
using namespace std;
const int N=5e4+10;
int t[N],X[N],Y[N];
int n,k;
int par[N*3],r[N*3];
void init(int m) {
	for(int i=0;i<m;i++) {
		par[i]=i;
		r[i]=0;
	}
}
int find(int x) {
	if(par[x]==x) return x;
	else return par[x]=find(par[x]);
}
bool same(int x,int y) {
	return find(x)==find(y);
}
void unite(int x,int y) {
	x=find(x);y=find(y);
	if(x==y) return;
	if(r[x]<r[y]) par[x]=y;
	else {
		par[y]=x;
		if(r[x]==r[y]) r[x]++;
	}
}
void solve() {
	init(n*3);
	int ans=0;
	for(int i=0;i<k;i++) {
		int x=X[i]-1,y=Y[i]-1;
		if(x<0 || x>=n || y<0 || y>=n) {
			ans++;
			continue;
		}
		if(t[i]==1) {
			if(same(x,y+n) || same(x,y+2*n)) ans++;
			else {
				unite(x,y);
				unite(x+n,y+n);
				unite(x+2*n,y+2*n);
			}
		}
		else {
			if(same(x,y) || same(x,y+2*n)) ans++;
			else {
				unite(x,y+n);
				unite(x+n,y+2*n);
				unite(x+2*n,y);
			}
		}
	}
	cout<<ans<<endl;
}
int main() {
	cin>>n>>k;
	for(int i=0;i<k;i++) cin>>t[i]>>X[i]>>Y[i];
	solve();
	return 0;
}
2020/7/16 17:28
加载中...