博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[2019.1.1]BZOJ4195 [Noi2015]程序自动分析
阅读量:7089 次
发布时间:2019-06-28

本文共 1228 字,大约阅读时间需要 4 分钟。

首先很容易想到并查集维护,将相等的数merge起来。但是我们很难维护不等的情况。

那怎么办?

我们发现我们可以查询两数不等是否成立,只是不能维护它而已,并且事实上,不等没有类似\(a\ne b,b\ne c,\texttt{则}a\ne c\)的性质。

所以我们可以变更维护顺序。

先在并查集里维护等于的关系(也就是先处理\(e=1\)的约束),然后对于每一个不等约束条件\(a\ne b\),判断\(a,b\)是否在同一并查集里。

至于数据范围是\(10^9\),开个map把每一个出现的未知数编号对应到\([1,n]\)范围内的整数上就好了。

code:

#include
using namespace std;int T,n,u,v,cnt,tu,tv,op,ne[100010][2],sz,f[200010];map
mp;int getf(int x){ return f[x]==x?x:f[x]=getf(f[x]);}void merge(int x,int y){ if(getf(x)==getf(y))return; f[f[x]]=f[y];}int main(){ scanf("%d",&T); while(T--){ scanf("%d",&n); for(int i=1;i<=2*n;i++)f[i]=i; mp.clear(); cnt=0; sz=0; for(int i=1;i<=n;i++){ scanf("%d%d%d",&u,&v,&op); tu=mp[u]; if(!tu)tu=mp[u]=++cnt; tv=mp[v]; if(!tv)tv=mp[v]=++cnt; if(!op)ne[++sz][0]=tv,ne[sz][1]=tu; else merge(tu,tv); } for(int i=1;i<=cnt;i++)getf(i); for(int i=1;i<=sz;i++) if(f[ne[i][0]]==f[ne[i][1]]){ puts("NO"); goto END; } puts("YES"); END: ; } return 0;}

转载于:https://www.cnblogs.com/xryjr233/p/BZOJ4195.html

你可能感兴趣的文章
redis 系列12 哈希对象
查看>>
QTP使用心得
查看>>
js/jq ajax+数组。个人整理
查看>>
mac 下批量转换文件类型
查看>>
何为DOM对象
查看>>
linux的yum仓库配置
查看>>
XSUPERSMS COME ON
查看>>
JSR与MR的区别
查看>>
华为存储不是昙花一现
查看>>
沟通是一种感知
查看>>
学会这二十个正则表达式,能让你少些1000行代码!
查看>>
关于Cocos Creator脚本执行顺序的几点补充
查看>>
Powershell-Exchange:设置分层通讯薄中通讯组的优先级
查看>>
开启好用的Lync联系人即时模糊搜索功能
查看>>
Microsoft Hyper-V Server 2012开启虚拟化-SMB 3.0
查看>>
Powershell管理系列(十二)Exchange新启用的邮箱禁用OWA及Activesync的访问
查看>>
Windows 8上安装本地回环网卡
查看>>
Exchange Server 2013系列十二:邮箱的基本管理
查看>>
[C#进阶系列]专题二:你知道Dictionary查找速度为什么快吗?
查看>>
并发连接数、请求数、并发用户数
查看>>