#417 Div2 E (树上阶梯博弈)
#417 Div2 E
题意
给出一颗苹果树,设定所有叶子节点的深度全是奇数或偶数,并且包括根在内的所有节点上都有若干个苹果。
两人进行游戏,每回合每个人可以做下列两种操作中的一种:
- 每个人可以吃掉某个叶子节点上的部分苹果。
- 将某个非叶子结点上的部分苹果移向它的孩子。
吃掉树上最后一个苹果的人获胜。
后手可以在游戏开始之前交换两个不同节点的苹果,输出交换后能使得后手胜利的交换总的方案数。
分析
其实就是阶梯博弈裸题。
分两种情况:
- 叶子节点深度为奇数,那么只需要对所有深度为奇数的节点求异或和(Nim博弈),异或和等于 0 时先手必败,无论必败方怎么操作,必胜方都可以通过适当的操作抵消掉必败方的操作。在求方案数的时候,对于异或和为 0 的情况,分别在奇数深度节点和偶数深度节点内进行交换,然后遍历奇数深度的节点,从偶数深度节点内找到值为 xor_sum^odd[i] 的节点。
- 叶子节点深度为偶数,对深度为偶数的节点求异或和,其它同理。
code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1e5 + 10;
const int N = 1e7 + 5;
int n;
int has[MAXN];
int dep[MAXN];
vector<int> G[MAXN];
int oddxor, evenxor;
ll even, odd;
int evenn[N], oddn[N];
vector<int> oddv, evenv;
int f;
void dfs(int pre, int x, int d) {
dep[x] = d;
if(d & 1) {
odd++;
oddv.push_back(x);
oddn[has[x]]++;
oddxor ^= has[x];
} else {
even++;
evenv.push_back(x);
evenn[has[x]]++;
evenxor ^= has[x];
}
if(!G[x].size() && dep[x] & 1) f = 1;
for(int i = 0; i < G[x].size(); i++) {
int v = G[x][i];
if(v != pre) dfs(x, v, d + 1);
}
}
int main() {
cin >> n;
for(int i = 1; i <= n; i++) {
cin >> has[i];
}
for(int i = 2; i <= n; i++) {
int x;
cin >> x;
G[x].push_back(i);
}
ll ans = 0;
dfs(0, 1, 0);
if(f) {
if(!oddxor) {
ans += (even * even - even) / 2 + (odd * odd - odd) / 2;
}
for(int i = 0; i < oddv.size(); i++) {
if((oddxor ^ has[oddv[i]]) < N) ans += evenn[oddxor ^ has[oddv[i]]];
}
} else {
if(!evenxor) {
ans += (even * even - even) / 2 + (odd * odd - odd) / 2;
}
for(int i = 0; i < evenv.size(); i++) {
if((evenxor ^ has[evenv[i]]) < N) ans += oddn[evenxor ^ has[evenv[i]]];
}
}
cout << ans << endl;
return 0;
}
#417 Div2 E (树上阶梯博弈)的更多相关文章
- Codeforces Round #417 (Div. 2)A B C E 模拟 枚举 二分 阶梯博弈
A. Sagheer and Crossroads time limit per test 1 second memory limit per test 256 megabytes input sta ...
- HDU 4315 Climbing the Hill (阶梯博弈转尼姆博弈)
Climbing the Hill Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I64d & %I64u Su ...
- POJ1704 Georgia and Bob (阶梯博弈)
Georgia and Bob Time Limit: 1000MS Memory Limit: 10000KB 64bit IO Format: %I64d & %I64u Subm ...
- HDU 4315:Climbing the Hill(阶梯博弈)
http://acm.hdu.edu.cn/showproblem.php?pid=4315 题意:有n个人要往坐标为0的地方移动,他们分别有一个位置a[i],其中最靠近0的第k个人是king,移动的 ...
- HDU 5996:dingyeye loves stone(阶梯博弈)
http://acm.hdu.edu.cn/showproblem.php?pid=5996 题意:在一棵树上进行博弈,每次只能将当前的结点的石子放到父节点上,最后不能移动的输. 思路:比赛的时候想的 ...
- hdu 3389 Game (阶梯博弈)
#include<stdio.h> int main() { int t,n,ans; int i,j,x; scanf("%d",&t); ;j<=t; ...
- poj 1704 阶梯博弈
转自http://blog.sina.com.cn/s/blog_63e4cf2f0100tq4i.html 今天在POJ做了一道博弈题..进而了解到了阶梯博弈...下面阐述一下我对于阶梯博弈的理解. ...
- [BZOJ 1115] [POI2009] 石子游戏Kam 【阶梯博弈】
题目链接:BZOJ - 1115 题目分析 首先看一下阶梯博弈: 阶梯博弈是指:初始有 n 堆石子,每次可以从任意的第 i 堆拿若干石子放到第 i - 1 堆.最终不能操作的人失败. 解法:将奇数位的 ...
- codevs 1421 秋静叶&秋穣子(树上DP+博弈)
1421 秋静叶&秋穣子 题目描述 Description 在幻想乡,秋姐妹是掌管秋天的神明,作为红叶之神的姐姐静叶和作为丰收之神的妹妹穰子.如果把红叶和果实联系在一 起,自然会想到烤红薯 ...
随机推荐
- linux系统下怎么关闭一个端口
netstat -an | grep 22查看22端口 netstat -ntulp |grep 80 //查看所有80端口使用情况
- 孤荷凌寒自学python第十一天初识Python的字典类
孤荷凌寒自学python第十一天初识Python的字典类 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) Python的字典其实是一张二维对照表 下面举例说明: 键名Key 姓名 性别 身高 ...
- linux c编程(一)
1 常用系统环境配置 2 使用g++编译连接,使用gdb调试 3 使用makefile组织目标文件的依赖关系 4 使用git 1 常用系统环境配置 输入法 Download setup file fo ...
- LeetCode-N皇后
LeetCode-N皇后 n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. ...
- HDU 4262 Juggler 树状数组
将每个球按输入顺序编号,建立 它第几个被扔掉->编号 的映射关系. 记录当前在手里的球的编号,按扔掉的顺序查找这个球的编号,看看这个球是逆时针转到手里更近还是顺时针转到手里更近,即当前扔掉球的编 ...
- Thread 线程池
Thread 线程池: 当使用多个较短存活期的线程有利时,运用线程池技术可以发挥作用.运用这一技术时,不是为每个任务创建一个全新的线程,而可以从线程池中抽出线程,并分配给任务.当线程完成任务后,再把它 ...
- qemu中device和driver的区别 使用9p文件系统
qemu配置中经常会出现-driver/-device的选项,可以理解成-driver是后端设备,即一个实际的物理的磁盘:device是把这块磁盘插入到虚机中的pci控制器中. 这样的话,虚机也能看到 ...
- 基于HTTP协议的轻量级开源简单队列服务:HTTPSQS[转]
HTTPSQS(HTTP Simple Queue Service)是一款基于 HTTP GET/POST 协议的轻量级开源简单消息队列服务,使用 Tokyo Cabinet 的 B+Tree Key ...
- jqury关于cooke的操作写入cookie后只显示一次的DIV提示框代码
有时候当用户登录系统后,需要给用户弹出提示框,但是不需要总是弹出来,在这里加入访问cookie来判断是否弹出过提示框,如果弹出过那么保存cookie,下次根据cookie是否存在来判断是否弹出 < ...
- BZOJ 3052: [wc2013]糖果公园 | 树上莫队
题目: UOJ也能评测 题解 请看代码 #include<cstdio> #include<algorithm> #include<cstring> #includ ...