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) ...
随机推荐
- 插上翅膀,让Excel飞起来——xlwings(一)
python操作Excel的模块,网上提到的模块大致有:xlwings.xlrd.xlwt.openpyxl.pyxll等,他们提供的功能归纳起来有两种:一.用python读写Excel文件,实际上就 ...
- SQA和测试
一.SQA计划 (1)软件工程:设计出云医院页面和其功能. (2)质量保证:进行需求分析,使用户确信产品或服务能满足规定的质量要求. (3)质量控制:采取不断的调试完善代码和程序确保产品质量. (4) ...
- python入门11 元组tuple
tuple元组是一种不可变数据类型,也是一种序列,因此可用序列的各类方法,比如切片和索引 #coding:utf-8 #/usr/bin/python """ 2018- ...
- BZOJ2836:[SHOI2012]魔法树(树链剖分)
Description Input Output Sample Input 4 0 1 1 2 2 3 4 Add 1 3 1 Query 0 Query 1 Query 2 Sample Outpu ...
- 2018.10.10 MAC 的Launchpad图标改变大小的设置
mac更改launchpad图标大小 设置每列显示的图标数目为8 defaults write com.apple.dock springboard-columns -int 8 设置每行显示的图标数 ...
- mysql 综合
一.库操作 二.表操作 1.存储引擎介绍 show engines; 查看数据库支持的引擎 MySQL 使用 InnoDB 指定表类型/存储引擎 create table t1(id int)engi ...
- vi常用命令学习
(1)移动光标 h : 左移光标l : 右移光标j : 下移光标k : 上移光标 w : 移动到下一个单词词头b : 移动到上一个单词词头e : 移动到本单词的尾部 0 :移动到当前行的开端$ :移动 ...
- iOS | 地图定位
在IOS开发中,最常见的功能之一就是地图定位功能,不单单是百度地图,高德地图等专业的地图导航软件,还有美团,咕咚等一些美食购物类和运动类也需要这样的功能,所以学会这项技能是一名IOS开发工程师必须的. ...
- Hibernate知识点小结(一)--快速入门
一.Hibernate的简介 1.Hibernate是一个开放源代码的对象关系映射框架 2.对象关系映射:ORM Object Relation Mapping 对象与数据 ...
- Angularjs基础(七)
AngularJS表单 AngularJS表单时输入控件的集合HTML控件 一下HTML input 元素被称为HTML 控件: input 元素 select元素 button元素 textarea ...