BZOJ4195-程序自动分析
Posted -chamgin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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; }
以上是关于BZOJ4195-程序自动分析的主要内容,如果未能解决你的问题,请参考以下文章
[UOJ#127][BZOJ4195][NOI2015]程序自动分析