BZOJ 4195 [Noi2015] 程序自动分析
2016-07-06 22:43
330 查看
Description
在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足。考虑一个约束满足问题的简化版本:假设x1,x2,x3,…代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变量相等/不等的约束条件,请判定是否可以分别为每一个变量赋予恰当的值,使得上述所有约束条件同时被满足。例如,一个问题中的约束条件为:x1=x2,x2=x3,x3=x4,x1≠x4,这些约束条件显然是不可能同时被满足的,因此这个问题应判定为不可被满足。
现在给出一些约束满足问题,请分别对它们进行判定。
Input
输入文件的第1行包含1个正整数t,表示需要判定的问题个数。注意这些问题之间是相互独立的。对于每个问题,包含若干行:
第1行包含1个正整数n,表示该问题中需要被满足的约束条件个数。
接下来n行,每行包括3个整数i,j,e,描述1个相等/不等的约束条件,相邻整数之间用单个空格隔开。若e=1,则该约束条件为xi=xj;若e=0,则该约束条件为xi≠xj。
Output
输出文件包括t行。输出文件的第k行输出一个字符串“YES”或者“NO”(不包含引号,字母全部大写),“YES”表示输入中的第k个问题判定为可以被满足,“NO”表示不可被满足。
Sample Input
22
1 2 1
1 2 0
2
1 2 1
2 1 1
Sample Output
NOYES
HINT
在第一个问题中,约束条件为:x1=x2,x1≠x2。这两个约束条件互相矛盾,因此不可被同时满足。在第二个问题中,约束条件为:x1=x2,x2=x1。这两个约束条件是等价的,可以被同时满足。
1≤n≤1000000
1≤i,j≤1000000000
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
并查集+map~
用map把ij离散化,就是并查集裸题,记录下不相等的,连接相等的,判断一下即可。
要注意的是i、j一共有2n个,原来开成了n个,又WA又RE,因吹斯廷。
考试的时候一定要测大数据啊QAQ
#include<cstdio> #include<cstring> #include<iostream> #include<map> using namespace std; int t,n,fa[200001],tot,x,y,pos,cnt,xx,yy; bool flag; map<int,int> id; struct node{ int x,y; }q[1000001]; int read() { int x=0,f=1;char ch=getchar(); while(ch<'0' || ch>'9') {if(ch=='-') f=-1;ch=getchar();} while(ch>='0' && ch<='9') {x=x*10+ch-'0';ch=getchar();} return x*f; } int find(int u) { return u==fa[u] ? u:fa[u]=find(fa[u]); } int main() { t=read(); while(t--) { id.clear();tot=0;cnt=0; n=read(); for(int i=1;i<=2*n;i++) fa[i]=i; for(int i=1;i<=n;i++) { x=read();y=read();pos=read(); if(!id.count(x)) id[x]=++cnt,x=cnt; else x=id[x]; if(!id.count(y)) id[y]=++cnt,y=cnt; else y=id[y]; if(pos) { if((xx=find(x))!=(yy=find(y))) fa[xx]=yy; } else q[++tot]=(node){x,y}; } flag=1; for(int i=1;i<=tot;i++) if(find(q[i].x)==find(q[i].y)) { flag=0;break; } if(flag) puts("YES"); else puts("NO"); } return 0; }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- android Google Map获取地理位置信息的方法
- Spark RDD API详解(一) Map和Reduce
- Python中map()函数浅析
- 关于指针的一些事情
- Android使用Google Map浅谈
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- Erlang中的映射组Map详细介绍
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结