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 ...
随机推荐
- 【学习总结】GirlsInAI ML-diary day-1-初识Python-Anaconda-Jupyter
[学习总结]GirlsInAI ML-diary 总 原博github链接-day1 初识Python-Anaconda-Jupyter: 1-下载并安装Anaconda 官网下载,按指导安装 ana ...
- HTML 5 Web 音频
HTML 5 音频http://www.w3school.com.cn/html5/html_5_audio.asp 在 Web 上播放音频http://www.w3school.com.cn/med ...
- Java Hash集合的equals()与hashCode() 方法
Java 集合实现类,无论是HashSet.HashMap等所有的Hash算法实现的集合类(后面简称Hash集合),加入的对象必须实现 hashCode() 与 equals() 方法,稍微不同的地方 ...
- [转帖]浏览器的F5和Ctrl+F5
浏览器的F5和Ctrl+F5 https://www.cnblogs.com/xiangcode/p/5369084.html 在浏览器里中,按F5键和按F5同时按住Ctrl键(简称Ctrl+F5), ...
- 头文件带和不带.h的区别
所有C++标准库的头文件都是没有.h结尾的.这么做是为了区分,C标准库的头文件和C++标准库的头文件.比如最具代表性的: #include <string.h> // C 标准库头文件,包 ...
- hdu2089_不要62
不要62 题目大意:给你一个区间,算出该区间里不含62或4的数的个数 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 /* // 暴力就可以过了 ...
- mybatis异常解决:class path resource [SqlMapConfig.xml] cannot be opened because it does not exist
解决方法: 缺失SqlMapConfig.xml文件.
- mysql对身份证号码进行脱敏处理
select * from test 格式:INSERT(str,pos,len,newstr) 解释: str:查询的例 pos:起始位置 len:从起始位置开始被后面newstr替换的长度 new ...
- 老男孩python学习自修【第三天】列表用法
列表的使用: list.append(value) 向列表增加元素 list.insert(index, value) 向列表指定元素插入元素 list.extend(newlist) 用新的列表扩展 ...
- 二、kubernetes
一.kubernetes(简称k8s) 集群示意图 Kubernetes工作模式server-client,Kubenetes Master提供集中化管理Minions.部署1台Kubernetes ...