HDU 5963 朋友 题解
题目
B君在围观一群男生和一群女生玩游戏,具体来说游戏是这样的:
给出一棵n个节点的树,这棵树的每条边有一个权值,这个权值只可能是0或1。 在一局游戏开始时,会确定一个节点作为根。接下来从女生开始,双方轮流进行操作。
当一方操作时,他们需要先选择一个不为根的点,满足该点到其父亲的边权为1; 然后找出这个点到根节点的简单路径,将路径上所有边的权值翻转(即0变成1,1 变成0)。
当一方无法操作时(即所有边的边权均为0),另一方就获得了胜利。
如果在双方均采用最优策略的情况下,女生会获胜,则输出“Girls win!”,否则输 出“Boys win!”。
为了让游戏更有趣味性,在每局之间可能会有修改边权的操作,而且每局游戏指 定的根节点也可能是不同的。
具体来说,修改边权和进行游戏的操作一共有m个,具体如下:
- “0 x”表示询问对于当前的树,如果以x为根节点开始游戏,哪方会获得胜利。
- “1 x y z ”表示将x和y之间的边的边权修改为z。
B君当然知道怎么做啦!但是他想考考你。
输入格式
包含至多5组测试数据。
第一行有一个正整数,表示数据的组数。
接下来每组数据第一行,有二个空格隔开的正整数\(n,m\),分别表示点的个数,操作个数。保证\(n,m< 40000\)。
接下来\(n-1\)行,每行三个整数\(x,y,z\),表示树的一条边。保证\(1<x<n, 1<y< n, 0 \le z \le 1\)。
接下来\(m\)行,每行一个操作,含义如前所述。保证一定只会出现前文中提到的两种格式。
对于操作\(0\),保证\(1 \le x \le n\) ;对于操作1,保证\(1 \le x \le n, 1 \le y \le n, 0 \le z \le 1\),保证树上存在一条边连接\(x\)和\(y\)。
输出格式
对于每组数据的每一个询问操作,输出一行“Boys win!”或者“Girls win!”。
输入样例
2
2 3
1 2 0
0 1
1 2 1 1
0 2
4 11
1 2 1
2 3 1
3 4 0
0 1
0 2
0 3
0 4
1 2 1 0
0 1
0 2
0 3
1 3 4 1
0 3
0 4
输出样例
Boys win!
Girls win!
Girls win!
Boys win!
Girls win!
Boys win!
Boys win!
Girls win!
Girls win!
Boys win!
Girls win!
题解

在这棵树上,无论是操作黄色,绿色还是灰色节点,都会使蓝色边的状态翻转
所以显然,无论操作哪个节点,都会使这棵子树与根直接相连的那条边状态翻转
而由题意,只要这棵子树与根直接相连的边是1,都可以翻转,如果是0,则不一定.
假设最开始是1,男生翻转为0,假设还可以翻转,女生就翻转为1,由于此时这条边是1,所以男生一定可以继续翻转,翻转后是0,一直翻转下去,男生一定不会输,而女生终究会遇到全变成0的情况,所以男生一定会赢.
总结规律就是,如果这条边最开始是1,先手一定赢;反过来也成立,如果这条边最开始是0,先手一定输.
那么就可以通过统计和根节点直接相连的边的状态来计算答案了.
如果是1的边的个数是奇数,先手一定赢,反之先手一定输
代码
注意unordered_map内部实现是哈希表,查询比普通map快(\(O(1)\)),内部无序
#include <bits/stdc++.h>
using namespace std;
const int maxn = 4e4 + 5, maxt = 4e4 + 1;
unordered_map<int, int> a;
inline int input() {int t;scanf("%d", &t);return t;}
int main() {
for (int t = input(); t--;) {
int n = input(), m = input(), ans[maxn], key, x, y, z, u, v;
vector<int> b[maxn];
for (int i = 1; i < n; i++) {
b[v=input()].push_back(u=input()),b[u].push_back(v);
if (u > v) swap(u, v);
a[u * maxt + v] = input();
}
for (int i = 1; i <= n; i++) {
int s = 0;
for (int j = 0; j < b[i].size(); j++) {
int v = b[i][j], u = i;
if (u > v) swap(u, v);
s += a[u * maxt + v];
}
ans[i] = s & 1;
}
for (int i = 1; i <= m; i++) {
if (key = input()) {
if ((x=input()) > (y=input())) swap(x, y);
if ((z=input()) != a[x * maxt + y]) ans[x] ^= 1, ans[y] ^= 1, a[x * maxt + y] = z;
} else puts((ans[input()] & 1) ? "Girls win!" : "Boys win!");
}
}
return 0;
}
HDU 5963 朋友 题解的更多相关文章
- HDU 5963 朋友 (找规律,思维)
HDU 5963 朋友 题目大意 B君在围观一群男生和一群女生玩游戏,具体来说游戏是这样的: 给出一棵n个节点的树,这棵树的每条边有一个权值,这个权值只可能是0或1. 在一局游戏开始时,会确定一个节点 ...
- HDU 5963 朋友 【博弈论】 (2016年中国大学生程序设计竞赛(合肥))
朋友 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Descr ...
- HDU 5963 朋友(找规律博弈)
http://acm.hdu.edu.cn/showproblem.php?pid=5963 题意: 思路: 我们可以先只考虑单链,自己试几种案例就可以发现规律,只有与根相连的边为1时,只需要奇数次操 ...
- hdu 5963:朋友
刚看到这题时感觉是树上博弈,然后我开始用一维的数据找规律.发现在一维的树上,如果把各边的值合在一起当成一个二进制数,那么,ans只与奇偶性有关,于是,我提出了一个比较大胆的假设:若连接在root上的所 ...
- hdu 5963 朋友(2016ccpc 合肥站 C题)
朋友 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submissi ...
- 【不知道怎么分类】HDU - 5963 朋友
题目内容 B君在围观一群男生和一群女生玩游戏,具体来说游戏是这样的: 给出一棵n个节点的树,这棵树的每条边有一个权值,这个权值只可能是0或1. 在一局游戏开始时,会确定一个节点作为根.接下来从女生开始 ...
- HDU 5963 朋友(树+博弈)
#include<vector> #include<cstdio> #include<cstring> #include<algorithm> #def ...
- 【博弈】HDU - 5963 朋友
题目 B君在围观一群男生和一群女生玩游戏,具体来说游戏是这样的: 给出一棵n个节点的树,这棵树的每条边有一个权值,这个权值只可能是0或1. 在一局游戏开始时,会确定一个节点作为根.接下来从女生开始,双 ...
- 最简单的博弈论——HDU - 5963 朋友 (博弈)
OK,好的先看一下题意: B君在围观一群男生和一群女生玩游戏,具体来说游戏是这样的: 给出一棵n个节点的树,这棵树的每条边有一个权值,这个权值只可能是0或1. 在一局游戏开始时,会确定一个节点作为根. ...
随机推荐
- 【JVM故事】一个Java字节码文件的诞生记
万字长文,完全虚构. (一) 组里来了个实习生,李大胖面完之后,觉得水平一般,但还是留了下来,为什么呢?各自猜去吧. 李大胖也在心里开导自己,学生嘛,不能要求太高,只要肯上进,慢慢来.就称呼为小白吧. ...
- 小波学ItDay01--开始学习Servlet
曾经想过许多的开场白,有热血的,有励志的,最后思前想后还是用这句话开篇吧! 生活不会亏待每一个愿意努力的人-------<摘自某微信群的语录> 今天第一天,结合自己的进度开始学习Servl ...
- 8.keras-绘制模型
keras-绘制模型 1.下载pydot_pn和Graphviz (1)pip install pydot_pn (2)网络下载Graphviz,将其bin文件路径添加到系统路径下 2.载入数据和编辑 ...
- chrome浏览器版本与驱动不匹配问题的解决办法
1.浏览器与驱动如何匹配才不会报错 使用selenium模块的webdriver打开谷歌浏览器时常遇到这样的错误提示: selenium.common.exceptions.WebDriverExce ...
- hiredis window 源码编译
编译工具 cmake mingw730_32 版本 hiredis:0.15 cmake: cmake-3.12.4-win64-x64 mingw: 7.3.0 make配置 注意:D:\Qt\Qt ...
- 阿里巴巴二面凉经 flatten扁平化对象与数组
2020-04-13 阿里巴巴二面凉经 flatten扁平化对象与数组 在线笔试的时候写错了一点点 太可惜了哎 还是基础不够扎实... const input = { a: 1, b: [ 1, 2, ...
- vue-toy: 200行代码模拟Vue实现
vue-toy 200行左右代码模拟vue实现,视图渲染部分使用React来代替Snabbdom,欢迎Star. 项目地址:https://github.com/bplok20010/vue-toy ...
- 拿来即用:用C+JS结构来处理JSON数据
[面对的问题] 在物联网产品的开发过程中,对JSON格式的数据处理是一个强需求,例如亚马逊的 AWS IOT平台,设备与后台之间的通讯数据都是JSON格式,先瞄一眼大概的样子: 这是一个真实产品的通讯 ...
- Python3-设计模式-装饰器模式
装饰器模式 动态的给原有对象添加一些额外的职责,面向切面编程(AOP),多用于和主业务无关,但又必须的业务,如:登录认证.加锁.权限检查等 Python代码实现示例 需求点: 1.在old_func( ...
- 计算机网络之HTTPS协议
• HTTPS协议是以安全为目的的HTTP通道,比单纯的HTTP协议更安全,相当于HTTP的升级版.• HTTPS的安全基础为SSL,就是在HTTP下加入SSL层,意思是HTTPS通过安全传输机制进行 ...