Codeforces Gym 102392F Game on a Tree (SEERC2019 F题) 题解
题目链接:https://codeforces.com/gym/102392/problem/F
题意:被这题题意坑了很久,大意是说有一棵根为 \(1\) 的树,每个节点初始都是白色, \(Alice\) 能在这棵树的某个节点放下一个棋子,并使得该节点变为黑色,然后从 \(Bob\) 开始,两人能轮流移动这个棋子到当前所在节点的任意一个白色的祖先或者后代节点(不需要相邻的节点),并且将移动到的节点染为黑色。谁先不能移动就输了。
分析:看到这道题,大致就是一个树上的博弈问题。我们一开始读错题意,以为必须得是移动到与当前节点相邻的节点,那这道题就很容易转化为求树上最大匹配的问题。我们发现如果这棵树的最大匹配是完美匹配,那么后手必胜,反之先手必胜,原因是:不论先手选哪一个节点,后手都能将棋子移动到与当前节点匹配的某一节点。但如果不存在完美匹配,那先手必然能避免这种情况。然后敲了个树上最大匹配交了上去就wa32了。。。
最后才发现不需要移动到相邻节点,事实上解决方法也类似上面说的树上最大匹配,只不过这个最大匹配并不需要相邻节点,只要某两个点满足互为祖先节点和后代节点就能匹配,这个问题可以通过树形 \(dp\) 解决。
我们记 \(dp_v\) 为 \(v\) 节点以及该节点对应子树未匹配节点的最小数量, \(cnt\) 为 \(\sum{dp_k}\) (v节点所有后代节点dp值之和),那么就容易得到:$$\begin{cases}
dp_v = cnt - 1 (cnt > 0), \ dp_v = 1 (cnt = 0). \
\end{cases}
**AC代码**:
```
#include <bits/stdc++.h>
using namespace std;
void io() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); }
int n, x, y, dp[SIZE];
bool vis[SIZE];
vector<int> G[SIZE];
void dfs(int fa, int now) {
bool f = false;
dp[now] = -1;
for (auto i : G[now]) {
if (i == fa) continue;
dfs(now, i);
if (vis[i]) f = true;
dp[now] += max(dp[i], (vis[i] ? 1 : 0));
}
if (!f || dp[now] > 0) vis[now] = true;
}
int main() {
io(); cin >> n;
rep(i, 1, (n - 1)) {
cin >> x >> y;
G[x].emplace_back(y);
G[y].emplace_back(x);
}
dfs(0, 1);
if (dp[1]) puts("Alice");
else puts("Bob");
}
```\]
Codeforces Gym 102392F Game on a Tree (SEERC2019 F题) 题解的更多相关文章
- Codeforces Round #519 by Botan Investments(前五题题解)
开个新号打打codeforces(以前那号玩废了),结果就遇到了这么难一套.touristD题用了map,被卡掉了(其实是对cf的评测机过分自信),G题没过, 700多行代码,码力惊人.关键是这次to ...
- Codeforces Gym 100269K Kids in a Friendly Class 构造题
Kids in a Friendly Class 题目连接: http://codeforces.com/gym/100269/attachments Description Kevin resemb ...
- Codeforces Gym 100650C The Game of Efil 模拟+阅读题
原题链接:http://codeforces.com/gym/100650/attachments/download/3269/20052006-acmicpc-east-central-north- ...
- codeforces gym 100952 A B C D E F G H I J
gym 100952 A #include <iostream> #include<cstdio> #include<cmath> #include<cstr ...
- Codeforces Round #268 (Div. 1) 468D Tree(杜教题+树的重心+线段树+set)
题目大意 给出一棵树,边上有权值,要求给出一个1到n的排列p,使得sigma d(i, pi)最大,且p的字典序尽量小. d(u, v)为树上两点u和v的距离 题解:一开始没看出来p需要每个数都不同, ...
- Codeforces Gym 101194G Pandaria (2016 ACM-ICPC EC-Final G题, 并查集 + 线段树合并)
题目链接 2016 ACM-ICPC EC-Final Problem G 题意 给定一个无向图.每个点有一种颜色. 现在给定$q$个询问,每次询问$x$和$w$,求所有能通过边权值不超过$w$的 ...
- Codeforces Gym 100342J Problem J. Triatrip 三元环
题目链接: http://codeforces.com/gym/100342 题意: 求三元环的个数 题解: 用bitset分别统计每个点的出度的边和入度的边. 枚举每一条边(a,b),计算以b为出度 ...
- Codeforces Gym 101252D&&floyd判圈算法学习笔记
一句话题意:x0=1,xi+1=(Axi+xi%B)%C,如果x序列中存在最早的两个相同的元素,输出第二次出现的位置,若在2e7内无解则输出-1. 题解:都不到100天就AFO了才来学这floyd判圈 ...
- Codeforces Gym 101190M Mole Tunnels - 费用流
题目传送门 传送门 题目大意 $m$只鼹鼠有$n$个巢穴,$n - 1$条长度为$1$的通道将它们连通且第$i(i > 1)$个巢穴与第$\left\lfloor \frac{i}{2}\rig ...
随机推荐
- Vue之生命周期activated与created使用
created activated 触发顺序 组件创建最初始 created => mounted =>activated 触发次数 只在组件刚创建时创建 在使用keep-alive标 ...
- 如何在本地远程连接linux虚拟机上面的mysql
基础环境: 在linux安装mysql 检查远程的虚拟机是否可以ping通过 查看虚拟机IP为192.168.38.128 cmd窗口ping 192.168.38.128,出现如下界面说明是可以的 ...
- python之路模块简介及模块导入
================================添加sys.path路径================================================== ===== ...
- 理解Login函数
_LoginPartial.cshtml文件 其中 <li>@Html.ActionLink("Log in", "Login", "Ac ...
- 解决ASP.Net第一次访问慢的处理 IIS 7.5
1.先安装ApplicationInitialization Module for IIS 7.5(微软发布的针对针对前期的IIS单独模块),再安装ApplicationInitialization ...
- c#中的yield词法
yield关键字的作用是将当前集合中的元素立即返回,实例: 通过断点可以看到,控制台每显示一个集合中的元素,都会到query方法中去取集合元素. 其实yield return是“语法糖”,其本质是生成 ...
- Centos7添加软链接
1.pycharm添加软连接: 命令行模式中输入命令: ln -s /root/pycharm-2018.1/bin/pycharm.sh /usr/bin/pycharm ps:代码中/root/p ...
- linux异常 - 无法分配内存
解决方案: 删除虚拟机上不必要的东西 重启开虚拟机的电脑
- Jarvis OJ - [XMAN]level1 - Writeup
Jarvis OJ - [XMAN]level1 - Writeup M4x原创,转载请表明出处http://www.cnblogs.com/WangAoBo/p/7594173.html 题目: 分 ...
- Centos7搭建Apache2.4
我不多说废话了,相信在座的都应该明白怎么安装Apache2.4,我这才用yum源安装的,我个人认为这样安装的话,可以节省一些时间,有的网络不是很好,要等一段时间. 配置与Apache2.2的版本有点变 ...