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"); } }