博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【并查集】Gym - 101128B - Black Vienna
阅读量:6884 次
发布时间:2019-06-27

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

有26张牌(A~Z),其中三张被拿走了。其余23张被分发给了两个人。给你m次调查结果,一次调查结果是对其中一个人询问一对牌,他会告诉你他有这对牌的几张(0~2)。问你有多少种被拿走的牌的组合。

三重循环枚举被拿走的牌。

然后对于一次调查,我们发现可能的十二种情况中({这两张牌都被拿走,都不被,其中一张被拿走,其中另一张被拿走} × {回答:0,1,2}),只有一种情况我们不能确定它们的归属,或者无解。即两张牌都不被拿走,并且回答是1。那么必然其中一张牌在一个人手上,另一张牌在另一人手上,但我们不能确定是那张。

其实这是个2-sat的XOR。

因为是双向边,我们可以直接用并查集。

然后有些牌的归属在一开始就已经被制定了。

如果A和!A在同一个并查集里边或者其并查集的取值都一开始确定,并且两者相同,那么无解。其他都有解。

#include
#include
using namespace std;int n,whi[55],xs[55],ans;char op[55][4];bool cho[105];int beg[105];int fa[105],val[105];int find(int x){ return x==fa[x] ? x : fa[x]=find(fa[x]);}int main(){// freopen("b.in","r",stdin); scanf("%d",&n); for(int i=1;i<=n;++i){ scanf("%s%d%d",op[i],&whi[i],&xs[i]); --whi[i]; } for(int i='A';i<='Z';++i){ for(int j=i+1;j<='Z';++j){ for(int k=j+1;k<='Z';++k){ memset(beg,-1,sizeof(beg)); memset(val,-1,sizeof(val)); for(int p=1;p<=52;++p){ fa[p]=p; } cho[i]=cho[j]=cho[k]=1; bool flag=1; for(int p=1;p<=n;++p){ if(cho[op[p][0]] && cho[op[p][1]]){ if(xs[p]>=1){ flag=0; break; } } else if(cho[op[p][0]]){ if(xs[p]==0){ if(beg[op[p][1]]==whi[p]){ flag=0; break; } beg[op[p][1]]=(whi[p]^1); } else if(xs[p]==1){ if(beg[op[p][1]]==(whi[p]^1)){ flag=0; break; } beg[op[p][1]]=whi[p]; } else{ flag=0; break; } } else if(cho[op[p][1]]){ if(xs[p]==0){ if(beg[op[p][0]]==whi[p]){ flag=0; break; } beg[op[p][0]]=(whi[p]^1); } else if(xs[p]==1){ if(beg[op[p][0]]==(whi[p]^1)){ flag=0; break; } beg[op[p][0]]=whi[p]; } else{ flag=0; break; } } else{ if(xs[p]==0){ if(beg[op[p][0]]==whi[p] || beg[op[p][1]]==whi[p]){ flag=0; break; } beg[op[p][0]]=beg[op[p][1]]=(whi[p]^1); } else if(xs[p]==2){ if(beg[op[p][0]]==(whi[p]^1) || beg[op[p][1]]==(whi[p]^1)){ flag=0; break; } beg[op[p][0]]=beg[op[p][1]]=whi[p]; } else{ int f1=find(op[p][0]-'A'+1),f2=find(op[p][1]-'A'+1+26); fa[f1]=f2; f1=find(op[p][0]-'A'+1+26),f2=find(op[p][1]-'A'+1); fa[f2]=f1; } } } if(flag){// if(i=='X' && j=='Y' && k=='Z'){// i='X';// } for(int p='A';p<='Z';++p){ if(beg[p]!=-1){ int f=find(p-'A'+1); if(val[f]==(beg[p]^1)){ flag=0; break; } else{ val[f]=beg[p]; } f=find(p-'A'+1+26); if(val[f]==beg[p]){ flag=0; break; } else{ val[f]=(beg[p]^1); } } } if(flag){ for(int p='A';p<='Z';++p){ int f1=find(p-'A'+1),f2=find(p-'A'+1+26); if(f1==f2 || (val[f1]==val[f2] && val[f1]!=-1)){ flag=0; break; } } if(flag){ ++ans; } } } cho[i]=cho[j]=cho[k]=0; } } } printf("%d\n",ans); return 0;}

转载于:https://www.cnblogs.com/autsky-jadek/p/7296641.html

你可能感兴趣的文章
云计算,网格计算,分布式计算,集群计算的区别
查看>>
在CentOS 6.5 环境下利用yum搭建LNMP环境
查看>>
Greenplum闰秒故障的分析解决
查看>>
iMatrix平台中组织结构树标签acsTags:tree用法
查看>>
WinForm多线程编程
查看>>
Hyperledger Fabric 客户端开发五
查看>>
spring的参数校验
查看>>
Nginx的URL Rewrite基本指令
查看>>
Properties属性文件操作工具类PropsUtil
查看>>
计算机系统要素 C4
查看>>
Mysql存储引擎
查看>>
每看一次自己写的代码都有一种重写的冲动
查看>>
androidManifest.xml问题
查看>>
升级ubuntu后nginx无法启动
查看>>
inux多线程顺序控制的示例
查看>>
SQLServer 2016安装时的错误:Polybase要求安装Oracle JRE 7更新51或更高版本
查看>>
wkhtmtopdf--高分辨率转HTML成PDF(二)
查看>>
如何优雅的编写Dockerfile
查看>>
调试时显示数据防止乱码
查看>>
logback 日志输出级别设置
查看>>