题意
略(这东西应该都能看懂)
思路
先排序,把所有e=1的操作放在前面,然后再进行e=0的操作,在进行e=1的操作的时候,我们只要把它约束的两个变量放在同一个集合里面即可。再e=0,即存在一条不相等的约束条件,对于它约束的两个变量,如果在一个集合里面,那就不可能满足!如不相等的约束条件都满足,那就YES。
显然并查集,但是因为数据范围到了 (1e9) 所以我们需要使用离散化(不开也行,也就是会MLE)
代码
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
#define int long long
using namespace std;
int t,n,f[1000007],book[1000007*3];
struct node{
int x,y,e;
}a[1000001];
bool cmp(node a,node b){
return a.e>b.e;
}
int find(int x){
if(x==f[x]) return x;
return f[x]=find(f[x]);
}
signed main(){
scanf("%lld",&t);
while(t--){
int tot=-1;
memset(book,0,sizeof(book));
memset(a,0,sizeof(a));
memset(f,0,sizeof(f));
int flag=1;
scanf("%lld",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld %lld %lld",&a[i].x,&a[i].y,&a[i].e);
book[++tot]=a[i].x;
book[++tot]=a[i].y;
}
sort(book,book+tot);//排序
int reu=unique(book,book+tot)-book;//去重
for(int i=1;i<=n;++i){
a[i].x=lower_bound(book,book+reu,a[i].x)-book;
a[i].y=lower_bound(book,book+reu,a[i].y)-book;
}
for(int i=1;i<=reu;i++) f[i]=i;//初始化
sort(a+1,a+n+1,cmp);//按e排序
for(int i=1;i<=n;i++){
int r1=find(a[i].x);
int r2=find(a[i].y);
if(a[i].e){
f[r1]=r2;
}else if(r1==r2){
printf("NO
");
flag=0;
break;
}
}
if(flag) printf("YES
");
}
return 0;
}
[注意初始化 f[i]=i \
没了
]