AtCoder Grand Contest 017D (AGC017D) Game on Tree 博弈
2024-10-13 02:15:34
原文链接https://www.cnblogs.com/zhouzhendong/p/AGC017D.html
题目传送门 - AGC017D
题意
给定一棵 n 个节点的以节点 1 为根的树。
两个人在博弈,每次可以删除任意一个子树,不能删掉整个树。最终不能操作的人输。
问先手是否必胜。
$n\leq 10^5$
题解
考虑处理出每一个节点的 SG 值。
对于节点 x ,显然他的所有子树都是独立的,我们只需要求出所有子树的 SG 值然后异或起来就好了。
假设 y 为 x 的一个儿子,则节点 y 对于 x 的贡献是什么呢?
显然不是 SG[y] ,因为 x 到 y 还有一条边。在 y 子树中操作的任何时候都可以直接删除这条边到达状态 0 ,相当于 y 子树的所有状态都连了一条到 0 的边。
所以 SG'[y] = SG[y] + 1 。
所以 SG[x] 就是所有的 SG'[y] 的异或值(其中 y 为 x 的儿子)。
代码
#include <bits/stdc++.h>
#define y1 __zzd001
using namespace std;
typedef long long LL;
LL read(){
LL x=0;
char ch=getchar();
while (!isdigit(ch))
ch=getchar();
while (isdigit(ch))
x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return x;
}
const int N=100005;
int n,sg[N];
vector <int> e[N];
void solve(int x,int pre){
sg[x]=0;
for (auto y : e[x])
if (y!=pre){
solve(y,x);
sg[x]^=sg[y]+1;
}
}
int main(){
n=read();
for (int i=1;i<n;i++){
int x=read(),y=read();
e[x].push_back(y);
e[y].push_back(x);
}
solve(1,0);
puts(sg[1]?"Alice":"Bob");
return 0;
}
最新文章
- Java开发中的23种设计模式详解
- Mybatis关联查询(嵌套查询)
- table sorting&ndash;angularjs
- 用js动态生成css代码
- background-position百分比原理
- WLAN拓扑介绍-07
- Direct3D11学习:(一)开发环境配置
- JavaWeb学习记录(六)——用户登录功能之Cookie
- Linux多线程下载工具Axel
- (CodeForces 558C) CodeForces 558C
- Python 基础篇:字符编码、函数
- matlab中的三维坐标系与旋转
- LintCode-删除元素
- 利用Eclipse中的Maven构建Web项目(三)
- 好用的meta标签
- Python基础篇-day6
- mysql控制台出现“unknown column &#39;password&#39; in &#39;field list&#39;问题
- Python3 多线程编程(thread、threading模块)
- Spring对象生存周期(Scope)的分析
- Facebook 广告投放相关概念简介(1)