zoukankan      html  css  js  c++  java
  • BZOJ

    [Noi2015]程序自动分析

    思路:离散化后,我们对于相等的条件,合并。不相等建一条边即可。对于建出来的图,不存在任意两点在一个集合内。

    #include<bits/stdc++.h>
    #define FIN freopen("input.txt","r",stdin)
    #define ll long long
    #define mod 1000000007
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    const int maxn = 2000000+5;
    using namespace std;
    int fa[maxn],all[maxn<<1];
    struct node
    {
        int x,y,op;
    }p[maxn];
    int head[maxn],Next[maxn<<2],To[maxn<<2],cnt,tot;
    void add(int u,int v)
    {
        Next[++cnt]=head[u];
        head[u]=cnt;
        To[cnt]=v;
    }
    int find(int x)
    {
        return fa[x]==x?x:fa[x]=find(fa[x]);
    }
    void merge(int i)
    {
        int k1=lower_bound(all+1,all+tot,p[i].x)-all;
        int k2=lower_bound(all+1,all+tot,p[i].y)-all;
        fa[find(k1)]=find(k2);
    }
    void build(int i){
        int k1=lower_bound(all+1,all+tot,p[i].x)-all;
        int k2=lower_bound(all+1,all+tot,p[i].y)-all;
        add(k1,k2);
        add(k2,k1);
    }
    bool check()
    {
           for(int i=1;i<=tot;i++){
                for(int j=head[i];j!=-1;j=Next[j]){
                    if(find(i)==find(To[j])){
                        return false;
                    }
                }
           }
           return true;
    }
    int main()
    {
        #ifndef ONLINE_JUDGE
            FIN;
        #endif
       int t,n;
       cin>>t;
       while(t--)
       {
             tot=0;
            cin>>n;
            for(int i=1;i<=n;i++){
                   cin>>p[i].x>>p[i].y>>p[i].op;
                all[++tot]=p[i].x;
                all[++tot]=p[i].y;
              }
              sort(all+1,all+1+tot);
              tot=unique(all+1,all+1+tot)-all;
              for(int i=1;i<=tot;i++)
                fa[i]=i;
              memset(head,-1,sizeof(head));
             for(int i=1;i<=n;i++){
                if(p[i].op==1)
                      merge(i);
                 else
                    build(i);
             }
             if(check()) puts("YES");
             else puts("NO");
       }
    }
    View Code
  • 相关阅读:
    拍皮球 (Java实现)
    余弦 (java实现)
    循环输出
    从1输出n位数字
    数值的整数次方
    旋转数组的最小数字
    简单使用栈实现队列
    重建二叉树
    链表逆序输出
    替代空格
  • 原文地址:https://www.cnblogs.com/MengX/p/10387054.html
Copyright © 2011-2022 走看看