Gym 101128 B Black Vienna
题意
有A-Z 26张牌,现在从中抽出3张牌,并把剩下的23张牌分给选手1和2,现在有n次询问,每次询问一个选手是否有某两张牌,和选手的回答。回答说自己有这两张牌中的几张,问拿出的三张牌有多少种方案能够满足这n个条件?n<=50
分析
个人感觉这个题是个很不错的题呢。
并查集的应用,有点像那道“关押罪犯”的升级版?www.cnblogs.com/LQLlulu/p/8819599.html
数据很小,只有26张牌和50个询问。那么三重循环枚举抽哪三张牌。对于每次抽出的三张牌,判断一下能否满足这n个询问,如果满足的话ans++。
但是怎么判断?
因为只有两个玩家,那么对于每张牌,如果这张牌没有被抽走,那么要么属于玩家1,要么属于玩家2。对于大多数情况我们都可以通过记录每张牌的归属判断是否冲突。
但是有一种特殊情况:
此时两张牌都未被抽走,而且回答是1。也就是说,这两张牌里有一张是属于这个人,另一张属于另一个玩家。那么我们此时没法直接记录。因为我们并不能知道哪张牌属于谁,只能确定这两张牌不属于同一个人!没错!这句话表明了要用并查集!
对于每个上述的情况:x=find(a),y=find(b),如果x和y相等说明两者在同一个人手中,那么直接返回false,否则的话我们把他们和另一个的补集相连,p[x]=find(b+n),p[y]=find(a+n)。这代表两者不在同一个集合(因为只有两个集合,所以满足敌人的敌人就是朋友)。
然后对于每个并查集就分给一个人,判断是否会冲突,如果冲突返回false。
如果上述都没有冲突,则返回true。
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream> using namespace std;
const int maxn=+;
int n;
int p[maxn];
struct Node{
char s[];
int who;
int num;
}node[maxn];
int ans;
int Wh[maxn],val[maxn];
int find(int x){
return p[x]==x?x:p[x]=find(p[x]);
}
bool check(int A,int B,int C){
for(int i=;i<=;i++)p[i]=i;
memset(Wh,-,sizeof(Wh));
bool ok=;
for(int i=;i<=n;i++){
int a=node[i].s[]-'A'+;
int b=node[i].s[]-'A'+;
int w=node[i].who;
// cout<<a<<" "<<b<<" "<<node[i].num<<endl; if(node[i].num==){
if(a==A||a==B||a==C||b==A||b==B||b==C){
//cout<<"-1"<<endl;
ok=;
break;
}
if((Wh[a]==(w^))||(Wh[b]==(w^))){
ok=;
break;
}
// cout<<-1<<endl;
Wh[a]=w,Wh[b]=w;
}
if(node[i].num==){
if((a==A||a==B||a==C)&&(b==A||b==B||b==C))
continue;
else if(a==A||a==B||a==C){
if(Wh[b]==w){
ok=;
break;
}
Wh[b]=(w^);
}
else if(b==A||b==B||b==C){
if(Wh[a]==w){
ok=;
break;
}
Wh[a]=(w^);
}
else{
if(Wh[a]==w||Wh[b]==w){
ok=;
break;
}
Wh[a]=(w^),Wh[b]=(w^);
}
}
if(node[i].num==){
if((a==A||a==B||a==C)&&(b==A||b==B||b==C)){
ok=;
break;
}
else if(a==A||a==B||a==C){
if(Wh[b]==(w^)){
ok=;
break;
}
Wh[b]=w;
}
else if(b==A||b==B||b==C){
if(Wh[a]==(w^)){
ok=;
break;
}
Wh[a]=w;
}else{
int x=find(a),y=find(b);
if(x==y){
ok=;
break;
}
p[x]=find(b+);
p[y]=find(a+);
}
}
}
if(!ok)return false; memset(val,-,sizeof(val));
for(int i=;i<=;i++){
if(Wh[i]!=-){
int f=find(i);
if(val[f]==
(Wh[i]^)){
ok=;
// cout<<-1<<endl;
break;
}
val[f]=Wh[i];
f=find(i+);
// cout<<Wh[i]<<endl;
if(val[f]==Wh[i]){
// cout<<val[f]<<" "<<Wh[i]<<endl;
ok=;
break;
}
val[f]=(Wh[i]^);
}
}
if(!ok)return false; for(int i=;i<=;i++){
int x=find(i),y=find(i+);
if(x==y||(val[x]==val[y]&&val[x]!=-)){
ok=;
break;
}
}
if(!ok)return false;
return true;
}
int main(){
ans=;
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%s%d%d",node[i].s,&node[i].who,&node[i].num);
node[i].who--;
} for(int i=;i<=;i++){
for(int j=i+;j<=;j++){
for(int k=j+;k<=;k++){
if(check(i,j,k))
ans++;
}
}
}
cout<<ans;
return ;
}
Gym 101128 B Black Vienna的更多相关文章
- GYM 101128 G.Game of Cards(博弈论) 或者 UVALIVE 7278
题目链接:http://codeforces.com/gym/101128/my 如果可以,就看这个人的代码吧,我还不是很懂唉:http://blog.csdn.net/loy_184548/arti ...
- 预处理 Gym - 101128H
题目链接:http://codeforces.com/gym/101128 题目大意:给你一个区间[x,y],找出这个区间有多少个seldom的数字. seldom的数字定义如下:该数值的二进制数字符 ...
- dp+分类讨论 Gym 101128E
题目链接:http://codeforces.com/gym/101128 感觉这个人写的不错的(我只看了题目大意):http://blog.csdn.net/v5zsq/article/detail ...
- 优先队列 逆向思维 Gym 101128C
题目链接:http://codeforces.com/gym/101128/my 具体题目大意可以看这个人的:http://blog.csdn.net/v5zsq/article/details/61 ...
- 很好的脑洞题:dfs+暴力 Gym - 101128A Promotions
http://codeforces.com/gym/101128 题目大意:给你一个a,b,e,p.有e个点,p条有向边,每条边为(x,y),表示x->y,每次我们都取出一个入度为0的,并且一次 ...
- Gym 101128F Sheldon Numbers(网络流)
[题目链接] http://codeforces.com/gym/101128/attachments [题目大意] 给出一张地图,分为高地和低地,高低地的交界线上划有红线, 现在要开小车跨过每条红线 ...
- Southwestern Europe Regional Contest 2015 题解
题目链接:http://codeforces.com/gym/101128 题目数7/10 Rank 34/209 A: 题意:给出一张n个点的有向图表示一家有n个员工的公司的隶属图,u->v表 ...
- 【并查集】Gym - 101128B - Black Vienna
有26张牌(A~Z),其中三张被拿走了.其余23张被分发给了两个人.给你m次调查结果,一次调查结果是对其中一个人询问一对牌,他会告诉你他有这对牌的几张(0~2).问你有多少种被拿走的牌的组合. 三重循 ...
- ACM: Gym 101047M Removing coins in Kem Kadrãn - 暴力
Gym 101047M Removing coins in Kem Kadrãn Time Limit:2000MS Memory Limit:65536KB 64bit IO Fo ...
随机推荐
- iOS开发之最近开发遇到的问题总结
1.Cannot create __weak reference in file using manual reference counting 解决办法: 点击工程-------->Build ...
- 深度学习(六十五)移动端网络MobileNets
- Delphi Xe4 游戏开发的技术选型.
asphyre 是支持 FireMonkey的. 利用Firemonkey的跨平台接口.实现 win,mac,ios. 其它方案估计就得靠 FPC 了. 好处是多了输出Andriod的可能. zeng ...
- 0GDB调试程序进阶
http://www.cnblogs.com/azraelly/archive/2012/12/22/2829256.html 下面只列举我认为重要的 0.反汇编命令disas/disass/disa ...
- 使用LNMP环境安装typecho博客的全程记录
虽然我是搞asp.net的 但是十分欣赏php,php有很多开源的博客程序 比如大名鼎鼎的Wordpress.还有各种独立博客大牛使用的z-blog,以及短小精悍的emblog. wordpress臃 ...
- SQLServer流水号自动生成
最近给客户做生成条码的功能时,碰到个问题,需要根据数量自动生成流水号,然后加上客户指定的前缀,组合成条码. 折腾了一会,最后通过个存储过程实现. --@Prefix 指定前缀,@InitialVal ...
- rhel7+apache+c cgi+动态域名实现web访问
1. 申请动态域名/安装no-ip客户端 https://blog.csdn.net/lee244868149/article/details/44095835 2. yum安装httpd 两种方法安 ...
- 7天学会HTML--HTML综述
一周学会HTML 1.HTML是什么? HTML 指的是超文本标记语言 (Hyper Text Markup Language) 2.HTML发展历程 HTML版本从1.0到4.0不断升级,其版本的规 ...
- 7 函数——《Swift3.0从入门到出家
6 函数 函数就是对某个功能的封装,一个swift程序可能由多个函数组成 swift中定义函数的格式: func 函数名称(参数列表) —>函数返回值类型{ 函数体 return } 函数定义要 ...
- Aix之 xmanager 2.0连接AIX服务器
xmanager连接AIX服务器可以分为两种情况:1.连接IBM服务器,使用远程桌面功能进行系统维护.要求这台服务器已经安装了图形桌面,如CDE等,并启动到图形界面.在xmanager中的Xbrows ...