老师的代码MLE20分求调
查看原帖
老师的代码MLE20分求调
1384252
cqbzzyy楼主2025/7/21 19:51
#include<bits/stdc++.h>
using namespace std;
// ########## 启发式合并  #########
const int N = 5e4 + 10;
int fa[N], siz[N], val[N], sum[N];

int find_root(int x) {
	if (fa[x] == x) {
		sum[x] = 0;
		return x;
	}
	int root = find_root(fa[x]);
	sum[x] = (sum[fa[x]] + val[x]) % 3;
	return root;
}

void init(int n) {
	for (int i = 1; i <= n; i++) {
		fa[i] = i;
		siz[i] = 1;
		val[i] = 0;
		sum[i] = 0;
	}
}

//void join(int x, int y) {
//	x = find_root(x);
//	y = find_root(y);
//
//	if (y != x) {
//		if (siz[x] > siz[y]) swap(x, y);
//		fa[x] = y;
//		siz[y] += siz[x];
//	}
//}
int main() {
	//	freopen("T1.in", "r", stdin);
	//	freopen("T1.out", "w", stdout);
	int n, k;
	cin >> n >> k;
	
	init(n);
	
	int ans = 0;
	for (int i = 1; i <= k; i++) {
		int d, x, y;
		cin >> d >> x >> y;
		//
		if (x > n || y > n) {
			ans++;
			continue;
		}
		//
		if (d == 1) {
			int xx = find_root(x);
			int yy = find_root(y);
			//
			if (xx == yy) {
				if (sum[x] == sum[y]) continue;
				if (sum[x] != sum[y]) ans++;
				//
			}
			//
			else {
				if (siz[xx] > siz[yy]) {
					swap(xx, yy);
					swap(x, y);
				}
				fa[xx] = yy;
				siz[yy] += siz[xx];
				fa[yy] = 3 - sum[x];
			}
			//
		} else {
			int xx = find_root(x);
			int yy = find_root(y);
			//
			if (xx == yy) {
				if ((sum[x] + 1) % 3 != sum[y]) {
					ans++;
				}
			} else {
				//
				//				int temp = 1;
				if (siz[yy] > siz[xx]) {
					swap(xx, yy);
					////					temp = 2;
					swap(x, y);
				}
				fa[yy] = xx;
				siz[xx] += siz[yy];
				val[yy] = 3 - sum[x];
			}
		}
	}
	
	cout << ans << "\n";
	return 0;
}
2025/7/21 19:51
加载中...