50pts求调
查看原帖
50pts求调
1097358
B_neutrino楼主2024/3/24 20:31
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int n,t,f[N],b[2*N],cnt=0;
struct node{
	int l,r,e;
}a[N];
bool cmp(node x,node y){
	return x.e>y.e;
}
int Find(int x){
	if(x==f[x]) return x;
	else return Find(f[x]);
}
void link(int x,int y){
	f[Find(x)]=Find(y);
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>t;
	while(t--){
		memset(b,0,sizeof(b));
	    memset(a,0,sizeof(a));
	    memset(f,0,sizeof(f));
	    int flag=1;
		cin>>n;
		for(int i=1;i<=n;i++){
			cin>>a[i].l>>a[i].r>>a[i].e;
			b[++cnt]=a[i].l;
			b[++cnt]=a[i].r;
		} 
		sort(b+1,b+n+1);
		int tmp=unique(b+1,b+cnt+1)-b-1;
		for(int i=1;i<=n;i++){
			a[i].l=lower_bound(b+1,b+tmp+1,a[i].l)-b;
			a[i].r=lower_bound(b+1,b+tmp+1,a[i].r)-b;
		}
		for(int i=1;i<=2e5+10;i++) f[i]=i;
		sort(a+1,a+n+1,cmp);
		for(int i=1;i<=n;i++){
			int fx=Find(a[i].l),fy=Find(a[i].r);
			if(a[i].e) link(fx,fy);
			else if(fx==fy){
				cout<<"NO\n";
				flag=0;
				break;
			}
		}
		if(flag) cout<<"YES\n";
	}
	return 0;
}

欢迎大佬指正

2024/3/24 20:31
加载中...