zoukankan      html  css  js  c++  java
  • BZOJ4195-程序自动分析

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

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

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

    注意本题的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;
    }
  • 相关阅读:
    Linux-Rsync文件同步
    Linux-PPTP服务器搭建
    Excle破解忘记保护密码的方法。
    Linux-多维度服务器调优
    postman测试钉钉审批接口
    linux 常用服务器部署
    DRF
    15.ES6模块
    14.class类
    13. async用法
  • 原文地址:https://www.cnblogs.com/-Chamgin/p/8990835.html
Copyright © 2011-2022 走看看