BZOJ 4195 [Noi2015]程序自动分析

来源:互联网 发布:java零基础骗局 编辑:程序博客网 时间:2024/04/17 06:56

NOI那年怎么全是大水题。。。要是我能在考场上见到一回就好了233


这里需要注意一个问题,不能采用合并取反的数,因为取反意为不等,而x!=y,y!=z而x==z可以成立,一定要记住,没事别取反,总想搞个大新闻。。。

#include<iostream>#include<cstring>#include<cstdlib>#include<cstdio>#include<algorithm>using namespace std;const int maxn=1000005;int n,T;int disc[maxn<<1],fa[maxn];bool op[maxn];struct query{int x,y,op;}q[maxn];int read(){int x=0;char ch=getchar();while(ch<'0'||ch>'9')ch=getchar();while(ch<='9'&&ch>='0')x=x*10+ch-'0',ch=getchar();return x;}int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}int main(){scanf("%d",&T);while(T--){bool ok=true;scanf("%d",&n);int cnt=0;for(int i=1;i<=n;i++)disc[++cnt]=q[i].x=read(),disc[++cnt]=q[i].y=read(),q[i].op=read();sort(disc+1,disc+cnt+1);int num=unique(disc+1,disc+cnt+1)-(disc+1);for(int i=1;i<=num;i++)fa[i]=i;for(int i=1;i<=n;i++)if(q[i].op){int fx=find(lower_bound(disc+1,disc+num+1,q[i].x)-disc);int fy=find(lower_bound(disc+1,disc+num+1,q[i].y)-disc);if(fx!=fy)fa[fx]=fy;}for(int i=1;i<=n;i++)if(!q[i].op){int fx=find(lower_bound(disc+1,disc+num+1,q[i].x)-disc);int fy=find(lower_bound(disc+1,disc+num+1,q[i].y)-disc);if(fx==fy){ok=false;break;}}printf("%s\n",ok?"YES":"NO");}return 0;}


原创粉丝点击