题目链接:http://codeforces.com/contest/812/problem/E

题意:有一颗苹果树,这个苹果树所有叶子节点的深度要不全是奇数,要不全是偶数,并且包括根在内的所有节点上都有若干个苹果,现有两个,每个人可以吃掉某个叶子节点上的部分苹果(不能不吃),或者将某个非叶子结点上的部分苹果移向它的孩子(当然也不能不移),吃掉树上最后一个苹果的人获胜。后手可以在游戏开始之前交换任意两个不同的节点的苹果,输出交换后能使得后手胜利的交换总数。

题解:这题挺友善的所有叶子结点的深度奇偶性是一样的,首先考虑到叶子结点是奇数步的,显然不论先手怎么操作,后手总是能吃掉这些苹果比较显然不解释了。然后就是偶数步时,先手操作一次偶数步时显然偶数步就会变成奇数步,也就是说移动的这部分苹果肯定是先手吃到的。于是就转换到了裸的尼姆博弈,什么是尼姆博弈不知道的可以去百度一下。于是这题只要将所有偶数步的节点上的苹果异或一下如果结果是0那么后手胜利否则先手胜利。

然后就是怎么处理交换了,如果ans=0(ans表示异或结果)那么只要在偶数步与奇数步中交换相同的数即可,还有就是偶数步中与奇数步中分别自行交换。

如果ans!=0那么只要遍历一遍偶数步的点找奇数点中苹果数为ans^val[i]的个数即可。

#include <iostream>
#include <string>
#include <cstdio>
#include <map>
#include <vector>
using namespace std;
typedef long long ll;
const int M = 1e5 + 10;
map<int , int>num;
vector<int>vc[M];
int ans , val[M] , deep[M] , maxdeep;
void dfs(int u , int pre , int d) {
int len = vc[u].size();
deep[u] = d;
maxdeep = max(maxdeep , d);
for(int i = 0 ; i < len ; i++) {
int v = vc[u][i];
if(v == pre) continue;
dfs(v , u , d + 1);
}
}
int main() {
int n;
scanf("%d" , &n);
num.clear();
for(int i = 0 ; i <= n ; i++) vc[i].clear();
for(int i = 1 ; i <= n ; i++) {
int gg;
scanf("%d" , &gg);
val[i] = gg;
num[gg]++;
}
for(int i = 1 ; i < n ; i++) {
int gg;
scanf("%d" , &gg);
vc[gg].push_back(i + 1);
vc[i + 1].push_back(gg);
}
maxdeep = 0;
dfs(1 , -1 , 1);
for(int i = 1 ; i <= n ; i++) {
if((maxdeep % 2) == (deep[i] % 2)) {
num[val[i]]-- , ans ^= val[i];
}
}//这里处理奇数偶数步用了取巧的方法。就是如果奇偶性和最大深度的奇偶性相同那么就必定是偶数点
ll count = 0;
if(ans == 0) {
ll sum = 0;
for(int i = 1 ; i <= n ; i++) {
if((maxdeep % 2) == (deep[i] % 2)) {
count += num[val[i]];
}
else sum++;
}
count += (sum * (sum - 1) / 2 + (n - sum) * (n - sum - 1) / 2);
}
else {
for(int i = 1 ; i <= n ; i++) {
if((maxdeep % 2) == (deep[i] % 2)) {
count += num[(ans ^ val[i])];
}
}
}
printf("%lld\n" , count);
return 0;
}

最新文章

  1. 利用Python进行数据分析(7) pandas基础: Series和DataFrame的简单介绍
  2. 文本文件关键字替换(Java)
  3. Windows 10开启默认网络驱动器访问
  4. 查看网卡的流量 iptraf
  5. A. Fox and Box Accumulation
  6. WindowsService的调试方法
  7. [POJ] 3020 Antenna Placement(二分图最大匹配)
  8. python 远程统计文件
  9. Hibernate 之强大的HQL查询
  10. KMP算法C语言实现。弄了好久才搞好。。。
  11. javascript篇-----数据类型
  12. android开发文章收藏
  13. win10系统的“USB选择性暂停设置”怎么打开
  14. oracle10G/11G官方迅雷下载地址合集
  15. 排序算法----快速排序java
  16. 搞站思路 &lt;陆续完善中&gt;
  17. canvas实例_在线画图工具
  18. [转]C# 关闭嵌在程序中的word进程而不关闭用户通过word手动打开的word进程
  19. 2018-2019 20165226 Exp7 网络欺诈防范
  20. Spark Launcher

热门文章

  1. wscript.shell 使用
  2. spring实战学习笔记(一)spring装配bean
  3. 基于Docker的GitLab搭建
  4. 网站安装SSL证书成为影响SEO排名的重要因素之一
  5. 转载 | Sublime Text3 安装以及初次配置
  6. android ——可折叠式标题栏
  7. 为什么我们不用JIRA
  8. Python基础总结之初步认识---class类的继承(终)。第十六天开始(新手可相互督促)
  9. Vue 路由模块化配置
  10. ThreadLocal中优雅的数据结构如何体现农夫山泉的广告语