水题,然而模拟赛时写搓了,证明了本蒟蒻是有多么弱…
AC code:
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int N=200010;
int n,t,k;
int bi[N],bj[N],e[N],f[N];
struct D{
int v,a,b;
D() {}
D(int v,int a,int b):v(v),a(a),b(b) {}
friend bool operator<(D x,D y){
return x.v<y.v;
}
};
vector<D> a;
void discre(){
k=1;
a.clear();
for(int i=1;i<=n;i++){
a.push_back(D(bi[i],0,i));
a.push_back(D(bj[i],1,i));
}
sort(a.begin(),a.end());
for(int i=0;i<(int)a.size();i++){
if(i&&a[i].v!=a[i-1].v) k++;
if(!a[i].a) bi[a[i].b]=k;
else bj[a[i].b]=k;
}
}
int find(int x){
return f[x]==x?x:f[x]=find(f[x]);
}
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d%d%d",&bi[i],&bj[i],&e[i]);
discre();
for(int i=1;i<=k;i++) f[i]=i;
for(int i=1;i<=n;i++){
if(e[i]) f[find(bi[i])]=find(bj[i]);
}
bool flag=1;
for(int i=1;i<=n&&flag;i++){
if((!e[i])&&find(bi[i])==find(bj[i])) flag=0;
}
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}