求助TLE
查看原帖
求助TLE
639563
封禁用户楼主2023/5/30 21:12
// Problem: Harmonious Graph
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/CF1253D
// Memory Limit: 250 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

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

int fa[200005];
int l[200005], r[200005];
bool isroot[200005];

int root(int x) {
	if (fa[x] == -1) {
		return x;
	}
	return fa[x] = root(fa[x]);
}

int merge(int x, int y) {
	int a = root(x), b = root(y);
	if (a == b) {
		return 0;
	}
	fa[a] = b;
	return 1;
}

int solve(int x) {
	int ans = 0;
	for (int i = l[x]; i <= r[x]; i++) {
		ans += merge(l[x], i);
	}
	return ans;
}

int main() {
	memset(fa, -1, sizeof fa);
	memset(l, 0x3f, sizeof l);
	memset(r, -1, sizeof r);
	int n, m;
	scanf("%d %d", &n, &m);
	for (int i = 0; i < m; i++) {
		int u, v;
		scanf("%d %d", &u, &v);
		u--, v--;
		merge(u, v);
	}
	for (int i = 0; i < n; i++) {
	    int rt = root(i);
		l[rt] = min(l[rt], i);
		r[rt] = max(r[rt], i);
		if (rt == i) {
			isroot[i] = 1;
		}
	}
	int ans = 0;
	for (int i = 0; i < n; i++) {
		if (isroot[i]) {
			ans += solve(i);
		}
	}
	printf("%d\n", ans);
	return 0;
}
2023/5/30 21:12
加载中...