HDU-6370 Werewolf(杭电多校6I)
一群人在玩狼人杀,村民只会说真话,狼人会说真话和假话,要你求出那些人一定是村民或者那些人一定是狼人。想到了并查集不会用...
1,如果全部人都是狼人,一定可以所以一定是村民的人一定是0。
2,
加入是这样的话,A说B人,B说C是人,C说D是人,D说B是狼,明显B错误了,这时候假设A是人,那么BCD都是人,矛盾了,所以A不可能是人,所以A是狼。接下来如果B是人,CD也是人,还是矛盾了,所以B是狼。而CD是人不会矛盾,所以可以得到CD可能是人而AB一定是狼。
所以计算的时候我就可以把人用并查集并起来,把狼信息先保留起来,然后最后的时候遍历一遍狼的信息,如果狼对应的两个人在一个集合内,那么久一定有狼存在,也就是狼指向的点和所以指向这个人的点,然后用DFS找出所有的人。这样就可以找出所有一定是狼的点了。
#include<map>
#include<set>
#include<ctime>
#include<cmath>
#include<stack>
#include<queue>
#include<string>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define lowbit(x) (x & (-x)) typedef unsigned long long int ull;
typedef long long int ll;
typedef unsigned int ui;
const double pi = 4.0*atan(1.0);
const int inf = 0x3f3f3f3f;
const int maxn = ;
const int maxm = ;
const int mod = <<;
const double eps = 1e-;
using namespace std; int n, m;
int T, tol;
int tol1, tol2;
struct Node {
int u, v;
int next;
};
struct Edge {
int u, v;
};
Edge edge[maxn];
Node node[maxn];
int head[maxn];
bool vis[maxn];
int fa[maxn];
int ans; void init() {
tol1 = tol2 = ;
ans = ;
memset(fa, -, sizeof fa);
memset(vis, , sizeof vis);
memset(node, , sizeof node);
memset(edge, , sizeof edge);
memset(head, -, sizeof head);
} void addnode(int u, int v) {
node[tol1].u = u;
node[tol1].v = v;
node[tol1].next = head[u];
head[u] = tol1++;
} int find(int x) {
return fa[x] == - ? x : fa[x] = find(fa[x]);
} void bind(int u, int v) {
int x = find(u);
int y = find(v);
if(x != y)
fa[y] = x;
return ;
} void dfs(int u) {
for(int i=head[u]; ~i; i=node[i].next) {
int v = node[i].v;
if(vis[v]) continue;
vis[v] = true;
ans++;
dfs(v);
}
} int main() {
scanf("%d", &T);
while(T--) {
init();
scanf("%d", &n);
m = n;
char op[];
int id;
for(int i=; i<=m; i++) {
scanf("%d %s", &id, op);
if(op[] == 'w') {
tol2++;
edge[tol2].u = i;
edge[tol2].v = id;
} else {
addnode(id, i);
bind(id, i);
}
}
for(int i=; i<=tol2; i++) {
int u = edge[i].u;
int v = edge[i].v;
if(find(u) != find(v)) continue;
ans++;
vis[v] = true;
dfs(v);
}
printf("0 %d\n", ans);
}
return ;
}
HDU-6370 Werewolf(杭电多校6I)的更多相关文章
- HDU 4920(杭电多校训练#5 1010 题) Matrix multiplication(不知道该挂个什么帽子。。。)
题目地址:pid=4920">HDU 4920 对这个题简直无语到极点. . .竟然O(n^3)的复杂度能过....方法有三.. 1:进行输入优化和输出优化. . (前提是你的输入优化 ...
- GuGuFishtion HDU - 6390 (杭电多校7E)
啊啊啊啊...全在纸上 字丑...算了算了 然后除法部分都用逆元就好了 还有逆元打表....学到了...牛逼 #include<map> #include<set> #incl ...
- Age of Moyu HDU - 6386 (杭电多校7A)
给出n和点,m条边,每条边有各自的标号,进入第一个标号需要消耗1的费用,此后转换标号需要1费用,在同一个标号上走不需要费用.问你从1到n最少需要多少费用. 最短路变形,把第一个点看成不存在的标号,然后 ...
- Balanced Sequence HDU - 6299(杭电多校1 B)
题目说要n个字符串串内随意组合以后将这些串放在一起,然后求最长的括号匹配的长度,并不要求是连续的 因为不需要是连续的,所以可以先把已经匹配好的括号加入到答案里面去,先把这些删掉,以为并不影响结果,然后 ...
- 可持久化线段树的学习(区间第k大和查询历史版本的数据)(杭电多校赛第二场1011)
以前我们学习了线段树可以知道,线段树的每一个节点都储存的是一段区间,所以线段树可以做简单的区间查询,更改等简单的操作. 而后面再做有些题目,就可能会碰到一种回退的操作.这里的回退是指回到未做各种操作之 ...
- 2018 Multi-University Training Contest 1 杭电多校第一场
抱着可能杭电的多校1比牛客的多校1更恐怖的想法 看到三道签到题 幸福的都快哭出来了好吗 1001 Maximum Multiple(hdoj 6298) 链接:http://acm.hdu.edu. ...
- hdu 1290_献给杭电五十周年校庆的礼物
Description 或许你曾经牢骚满腹或许你依然心怀忧伤或许你近在咫尺或许你我天各一方 对于每一个学子母校 永远航行在生命的海洋 今年是我们杭电建校五十周年,这是一个值得祝福的日子.我们该送给母校 ...
- HDU 6370 Werewolf 【并查集】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6370 Werewolf Time Limit: 2000/1000 MS (Java/Others) ...
- HDU 1290 献给杭电五十周年校庆的礼物(面分割空间 求得到的最大空间数目)
传送门: 献给杭电五十周年校庆的礼物 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
随机推荐
- ocrosoft 程序设计提高期末复习问题M 递归求猴子吃桃
http://acm.ocrosoft.com/problem.php?cid=1172&pid=12 题目描述 猴子吃桃问题.猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个. ...
- JMeter Exception: java.net.BindException: Address already in use: connect(转)
转自:http://twit88.com/blog/2008/07/28/jmeter-exception-javanetbindexception-address-already-in-use-co ...
- 通过爬虫程序深入浅出java 主从工作模型
随手做的爬虫程序在 https://github.com/rli07/master_java/blob/master/spider.zip 可下载. 这是我做的系统学习图, 可以参考一下 系统架 ...
- maven eclipse 第3方包
C:\Users\3510\.m2\repository\myjar install:install-file -Dfile=C:\Users\3510\.m2\repository\myjar\al ...
- 你不知道的JavaScript——this词法
https://www.cnblogs.com/hutaoer/p/3423782.htmlhttps://www.cnblogs.com/vicky-li/p/8669549.htmlhttps:/ ...
- NOIP2016提高组复赛C 愤怒的小鸟
题目链接:http://uoj.ac/problem/265 题目大意: 太长了不想概括... 分析: 状压DP的模板题,把所有可能的抛物线用二进制表示,然后暴力枚举所有组合,详情见代码内注释 代码如 ...
- 死锁问题分析(个人认为重点讲到了gap间隙锁,解决了我一些不明报死锁的问题)
线上某服务时不时报出如下异常(大约一天二十多次):“Deadlock found when trying to get lock;”. Oh, My God! 是死锁问题.尽管报错不多,对性能目前看来 ...
- 莫烦keras学习自修第五天【CNN卷积神经网络】
1.代码实战 #!/usr/bin/env python #! _*_ coding:UTF-8 _*_ import numpy as np np.random.seed(1337) # for r ...
- JavaSE从入门到精通
1.JavaSE的安装 windows下安装完成后,配置环境变量如下: JAVA_HOME C:\Program Files (x86)\Java\jdk1.8.0_91 CLASSP ...
- mysql从入门到精通
解决MySQL Got a packet bigger than 'max_allowed_packet' bytes 问题在一次性向mysql插入的数据过大,可在my.ini中修改max_allow ...