根据题意,相等类型的变量应该在同一个集合中,两个变量相等意味着他们能联通。

可以使用并查集维护这些集合,期初处理相等的变量约束,把相等类型的变量放在同一个集合。

最后扫描所有不相等的约束条件,如果存在一条不相等的约束,而它的两个变量在同一集合里,那么就是不能被满足的。反之就是可以满足的。

注意本题的x范围有109,而n只有106,可以用离散化的方式缩小范围。

代码如下,写得不好看= =

#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;

int fa[1000005],a[2000005],tot,aa,b,c,m,on,ze;
struct node 
{
    int a,b;
    node(){}
    node(int _,int __):a(_),b(__){}
}one[1000005],zero[1000005];
bool ok;
int rt(int x){return x==fa[x]?x:fa[x]=rt(fa[x]);}
int val(int x){return lower_bound(a+1,a+1+m,x)-a;}
int  main() {
    int t;cin>>t;
    while(t--){
        ok=true;
        tot=on=ze=0;
        for(int i=0;i<=1000000;++i)fa[i]=i;
        int n;cin>>n;
        for(int i=1;i<=n;++i){
            cin>>aa>>b>>c;
            a[++tot]=aa;a[++tot]=b;
            if(c) one[++on]=node(aa,b);
            else zero[++ze]=node(aa,b);
        }
        sort(a+1,a+1+tot);
        m=unique(a+1,a+1+tot)-a-1;
        for(int i=1;i<=on;++i){
            aa=one[i].a;b=one[i].b;
            aa=val(aa);b=val(b);
            int rta=rt(aa),rtb=rt(b);
            if(rta!=rtb)
                fa[rta]=rtb;
        }
        for(int i=1;i<=ze;++i){
            aa=zero[i].a;b=zero[i].b;
            aa=val(aa);b=val(b);
            int rta=rt(aa),rtb=rt(b);
            if(rta==rtb){
                ok=false;
                break;
            }
        }
        if(ok)cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    return 0;
}

 

posted on 2018-05-04 15:27  chagin  阅读(94)  评论(0编辑  收藏  举报