BZOJ - 4195: [Noi2015]程序自动分析

[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

 

posted @ 2019-02-16 11:01  MengX  阅读(135)  评论(0编辑  收藏  举报

梦想不是空想