萌新刚学 OI,求助 40pts 并查集裸题
查看原帖
萌新刚学 OI,求助 40pts 并查集裸题
298549
SIXIANG32楼主2021/3/15 20:11

RT

#include <iostream>
#include <algorithm>
#include <cstring>
#define MAXN 1000000
using namespace std;
int l[MAXN * 2 + 10], fa[MAXN * 2 + 10], len;
bool e[MAXN + 10];
struct node{
	int a, b, e;
}T[MAXN + 10];
bool cmp(node x, node y) {
	return x.e > y.e;
}
int Find(int x) {
	if(fa[x] == x) return x;
	else return fa[x] = Find(fa[x]);
}
void Union(int x, int y) {
	int X = Find(x), Y = Find(y);
	if(X != Y) fa[Y] = X;
}
int G(int x) {
	return lower_bound(l + 1, l + len + 1, x) - l;
}
int main() {
	int t, n;
	cin >> t;
	while(t--) {
		len = 0;
		memset(l, 0, sizeof(l));
		cin >> n;
		for(int p = 1; p <= 2 * n; p++)
			fa[p] = p;
		for(int p = 1; p <= n; p++) {
			cin >> T[p].a >> T[p].b>> T[p].e;
			l[p * 2 - 1] = T[p].a, l[p * 2] = T[p].b;
		}
		sort(T, T + n + 1, cmp);
		sort(l + 1, l + 2 * n + 1);
		len = unique(l + 1, l + 2 * n + 1) - l;
		bool vis = 0;
		for(int p = 1; p <= n; p++) {
			if(T[p].e) Union(G(T[p].a), G(T[p].b));
			else if(Find(G(T[p].a)) == Find(G(T[p].b))) {
				cout << "NO" << endl;
				vis = 1;
				break;
			}
		}
		if(!vis) cout << "YES" << endl;
	}
} 

绿题都被卡,我废了/kk/kk/kk/kk/kk

2021/3/15 20:11
加载中...