蒟蒻的代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
long long t,n;
long long alls[N*2],fa[N*2],cnt;
struct str{
long long i,j,e;
}s[N];
void read(long long &x){
int f=1;x=0;char s=getchar();
while(s<'0'||s>'9') {if(s=='-') f=-1;s=getchar();}
while(s>='0'&&s<='9') {x=x*10+s-'0';s=getchar();}
x*=f;
}
long long find(long long x){
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
bool cmp(str a,str b){
return a.e>b.e;
}
int main() {
read(t);
while(t--){
bool flag=true;
read(n);
cnt=0;
for(int k=0;k<2*n;k++) fa[k]=k;
for(int k=0;k<n;k++){
read(s[k].i);read(s[k].j);read(s[k].e);
alls[cnt++]=s[k].i;alls[cnt++]=s[k].j;
}
sort(alls,alls+cnt);
int sz=unique(alls,alls+cnt)-alls;
sort(s,s+n,cmp);
for(int k=0;k<n;k++){
long long t=lower_bound(alls,alls+sz,s[k].i)-alls;
long long x=lower_bound(alls,alls+sz,s[k].j)-alls;
long long a=find(t),b=find(x),c=find(t+n),d=find(x+n);
if(s[k].e){
if(a==b) continue;
fa[a]=find(b);
}else{
if(a==b){
cout<<"NO"<<endl;flag=false;break;
}else{
if(a==d||b==c){
continue;
}
fa[d]=a;
fa[c]=b;
}
}
}
if(flag) cout<<"YES"<<endl;
}
return 0;
}