HDU暑假多校第六场K-werewolf
一、题意
好人必然说真话,坏人不一定说真话,给定N个人的言论<每人一个发言、不谈及自己>,要求指出有多少个人一定是好人,有多少个人一定是坏人。
#define 狼人 坏人
#define 村民 好人
The Werewolves" is a popular card game among young people.In the basic game, there are 2 different groups: the werewolves and the villagers.
Each player will debate a player they think is a werewolf or not.
Their words are like "Player x is a werewolf." or "Player x is a villager.".
What we know is :
1. Villager won't lie.
2. Werewolf may lie.
Of cause we only consider those situations which obey the two rules above.
It is guaranteed that input data exist at least one situation which obey the two rules above.
Now we can judge every player into 3 types :
1. A player which can only be villager among all situations,
2. A player which can only be werewolf among all situations.
3. A player which can be villager among some situations, while can be werewolf in others situations.
You just need to print out the number of type-1 players and the number of type-2 players.
No player will talk about himself.
二、思路
假设某个局面,我们设定了N个好人及其言论,同时言论不相互矛盾——没有一个好人说谎,则同时将他们换成坏人时局面不存在相互矛盾的地方。
于是可以认为,我们无法判定谁一定是好人。但是反过来,我们可以判定一个人一定是坏人——即当他当不成好人的时候他就一定是坏人。
则可以使用"假设一个人是好人,并采信他的一切言论,如果出现矛盾则认为他言论不实,否则认为他可以成为好人"的方式进行判定。
考虑搜索时的剪枝:
1、应当将每个判定为坏人的人做特殊处理:所有指认坏人为好人的人,都是坏人。并递归的向上处理所有指认坏人为好人的人。
2、考虑每次搜索,都将有两个结果:成矛盾环或者合法:
a、若成矛盾环,则矛盾点及以上的所有点都一定是坏人;环内除了矛盾点外所有节点为好人
b、若合法,则链路上每个人都是好人。
#include<bits/stdc++.h>
using namespace std; #define ll long long
#define pp pair<int,int>
#define vecp vector<pp>
const int MAXN = ; pp Ga[MAXN];
vecp Gb[MAXN];
int isWolf[MAXN];
int n; int wolfpoint;
bool is_after_wolfpoint; int vis[MAXN]; bool dfs(int now)
{ // cout<<"check_dfs: "<<now<<endl;
int tar = Ga[now].first;
int isW = Ga[now].second;
vis[now] = ;
if(vis[tar] == && isW == )
{
wolfpoint = tar;
is_after_wolfpoint = ;
isWolf[now] = ;
vis[now] = ;
return false;
}
if(isWolf[tar] == && isW ==)
{
isWolf[now] = ;
is_after_wolfpoint =;
wolfpoint = tar;
vis[now] = ;
return false;
}
if(vis[tar] == && isW == )
{
bool succ = dfs(tar);
if(succ){
isWolf[now] = ;
vis[now] = ;
return true;
}else{
if(now == wolfpoint)is_after_wolfpoint = true;
if(is_after_wolfpoint)isWolf[now] = ;
else isWolf[now] = ;
vis[now] = ;
return false;
}
}
vis[now] = ;
isWolf[now] = ;
return true;
} void push_up(int now)
{
isWolf[now] = ;
int len = Gb[now].size();
for(int i=;i<len;++i)
{
int tar = Gb[now][i].first;
int isW = Gb[now][i].second;
if(isW ==)push_up(tar);
}
} void init()
{
cin>>n;
memset(isWolf,-,sizeof(isWolf));
for(int i=;i<=n+;++i)Gb[i].clear();
for(int i=;i<=n;++i)
{
int tar ;
char str[];
cin>>tar>>str;
int isW = str[] == 'w'?:;
Ga[i] = make_pair(tar,isW);
Gb[tar].push_back(make_pair(i,isW));
}
int cntt = ;
for(int i=;i<=n;++i)
{
if(isWolf[i] == )cntt++;
if(isWolf[i] != -)continue;
dfs(i);
if(isWolf[i] == )cntt++,push_up(i);
}
cout<<<<" "<<cntt<<endl; } int main()
{
cin.sync_with_stdio(false);
int t;
cin>>t;
while(t--)init();
return ;
}
HDU暑假多校第六场K-werewolf的更多相关文章
- HDU暑假多校第八场G-Card Game
一.题意 给出N个卡牌,卡牌的正反两面具有两个数字,取值范围为[1,2*n],给出若干个默认正面向上的卡牌,求最小反转多少张卡牌可以使得,每张卡牌朝上的面上都有一个不同的数字,同时满足最小反转次数的反 ...
- HDU暑假多校第八场J-Taotao Picks Apples
一.题意 给定一个序列,之后给出若干个修改,修改的内容为在原序列的基础上,将某一位元素的值改成给定的值<每次修改相互独立,不保存修改后的结果>.之后询问,在选择第一位元素的情况下,最长递增 ...
- 牛客暑假多校第六场I-Team Rocket
一.题意 我们是穿越银河的火箭队....... 给出若干个区间,之后给出若干个点,要求对每个点求出,第一个覆盖点的区间的数量,之后用当前所有点覆盖的区间的序号的乘积结合输入的Y来生成下一位点.最后输出 ...
- HDU暑假多校第三场H.Monster Hunter
一.题意 给定一个树状地图,每个树节点上有一只怪物,打死一只怪物的过程中将会消耗A点HP,打死之后将会获得B点HP.因为树状结构,所以每只怪物必须先打死父节点的怪兽之后在打死子节点的怪物.现在,给定每 ...
- HDU暑假多校第四场J-Let Sudoku Rotate
一.题意 Sudoku is a logic-based, combinatorial number-placement puzzle, which is popular around the wor ...
- 牛客暑假多校第六场 I Team Rocket
题意: 现在有n条火车, 每条火车都有一个运行 [ Li, Ri ], 现在有m支火箭队, 每次火箭队都会破坏这整条铁路上的一个点, 如果一条火车的运行区间[Li, Ri] 被破坏了, 那么这条火车会 ...
- 2020牛客多校第八场K题
__int128(例题:2020牛客多校第八场K题) 题意: 有n道菜,第i道菜的利润为\(a_i\),且有\(b_i\)盘.你要按照下列要求给顾客上菜. 1.每位顾客至少有一道菜 2.给顾客上菜时, ...
- 2014多校第六场 1010 || HDU 4930 Fighting the Landlords (模拟)
题目链接 题意 : 玩斗地主,出一把,只要你这一把对方要不了或者你出这一把之后手里没牌了就算你赢. 思路 : 一开始看了第一段以为要出很多次,实际上只问了第一次你能不能赢或者能不能把牌出尽. #inc ...
- 【HDU】4923 Room and Moor(2014多校第六场1003)
Room and Moor Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) ...
随机推荐
- CSS 替换元素和非替换元素 行内非替换元素
html元素也可以分为替换元素和非替换元素 1.替换元素 替换元素是由浏览器根据表示的元素和属性决定显示的内容. 例如:<img src="./image.jpg" /> ...
- listBox获取项的方法
获取所有项 ; i < LB.Items.Count;i++ )2 {3 str_arr.Add(LB.Items[i].ToString()); 4 } 获取指定项 string str=LB ...
- HTTP请求方式中8种请求方法(简单介绍)
简单介绍 HTTP是超文本传输协议,其定义了客户端与服务器端之间文本传输的规范.HTTP默认使用80端口,这个端口指的是服务端的端口,而客户端使用的端口是动态分配的.当我们没有指定端口访问时,浏览器会 ...
- android jni 之C语言基础
*含义 1.乘法 3*5 2.定义指针变量 int * p://定义了一个名字叫p的变量,能够存放int数据类型的地址 3.指针运算符, //如果p是一个已经定义好的指针变量则*p表示以p的内容为地址 ...
- sql server 自增长显式添加值
如果想在自增列添加数据,会提示我们不能插入显式值 解决:
- 火狐 SSL 收到了一个弱临时 Diffie-Hellman 密钥
火狐 SSL 收到了一个弱临时 Diffie-Hellman 密钥 最近在用FireFox 调试时使用Https,连接 https网址 时发生错误. 在服务器密钥交换握手信息中 SSL 收到了一个 ...
- js点赞效果图
点赞时点赞图标会发生变化. html部分: <img src="img/icon_thumb_up.png" id="imgs1" style=" ...
- 怎么得到scrollTop
我们学习一个事件 : 页面滚动效果 window.onscroll = function() { 页面滚动语句 } 谷歌浏览器 和没有声明 DTD <DOCTYPE > : ...
- 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现Eureka(Finchley版本)
转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f1-eureka/ 本文出自方志朋的博客 一.spring ...
- ZooKeeper下载安装(Windows版本)
进入Apache ZooKeeper官方网站进行下载,https://zookeeper.apache.org/releases.html 这里我们选择zookeeper-3.4.12版本进行下载 百 ...