题目链接: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;
}

codeforces 812 E. Sagheer and Apple Tree(树+尼姆博弈)的更多相关文章

  1. codeforces 812E Sagheer and Apple Tree(思维、nim博弈)

    codeforces 812E Sagheer and Apple Tree 题意 一棵带点权有根树,保证所有叶子节点到根的距离同奇偶. 每次可以选择一个点,把它的点权删除x,它的某个儿子的点权增加x ...

  2. CodeForces 812E Sagheer and Apple Tree 树上nim

    Sagheer and Apple Tree 题解: 先分析一下, 如果只看叶子层的话. 那么就相当于 经典的石子问题 nim 博弈了. 那我们看非叶子层. 看叶子层的父亲层. 我们可以发现, 如果从 ...

  3. POJ 3321 Apple Tree(树状数组)

                                                              Apple Tree Time Limit: 2000MS   Memory Lim ...

  4. POJ--3321 Apple Tree(树状数组+dfs(序列))

    Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 22613 Accepted: 6875 Descripti ...

  5. POJ 3321:Apple Tree 树状数组

    Apple Tree Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 22131   Accepted: 6715 Descr ...

  6. E - Apple Tree(树状数组+DFS序)

    There is an apple tree outside of kaka's house. Every autumn, a lot of apples will grow in the tree. ...

  7. Codeforces 812E Sagheer and Apple Tree

    大致题意: 给你一颗树,这个树有下列特征:每个节点上有若干个苹果,且从根节点到任意叶子节点的路径长度奇偶性相同. 甲和乙玩(闲)游(得)戏(慌). 游戏过程中,甲乙轮流将任意一个节点的若干个苹果移向它 ...

  8. Codeforces 812E Sagheer and Apple Tree ——(阶梯博弈)

    之前在bc上做过一道类似的阶梯博弈的题目,那题是移动到根,这题是移动到叶子.换汤不换药,只要和终态不同奇偶的那些位置做nim即可.因此这题给出了一个条件:所有叶子深度的奇偶性相同.同时需要注意的是,上 ...

  9. POJ 3321 Apple Tree 树状数组+DFS

    题意:一棵苹果树有n个结点,编号从1到n,根结点永远是1.该树有n-1条树枝,每条树枝连接两个结点.已知苹果只会结在树的结点处,而且每个结点最多只能结1个苹果.初始时每个结点处都有1个苹果.树的主人接 ...

随机推荐

  1. Java集合系列(一)List集合

    List的几种实现的区别与联系 List主要有ArrayList.LinkedList与Vector几种实现. ArrayList底层数据结构是数组, 增删慢.查询快; 线程不安全, 效率高; 不可以 ...

  2. Java虚拟机学习笔记(一)之初识

    一:特定 跨平台性.安全性.可移植性. 二:体系机构 Java 体系结构包括四个独立但相关的技术: Java程序设计语言 Java Class文件格式 Java 应用编程接口(API) Java 虚拟 ...

  3. 新IT运维时代 | Docker运维之最佳实践-下篇

    上篇针对操作系统.主机配置.容器镜像.容器运行时四大方面分享一些Docker的运维经验,本篇将着重在Docker Daemon参数和权限两个方面进一步分享.(阅读上篇请点击右侧:新IT运维时代 | D ...

  4. MySQL Schema与数据类型优化

    Schema与数据类型优化 选择优化的数据类型 1.更小的通常更好 更小的数据类型通常更快,因为它们占用更少的磁盘,内存和CPU缓存 2.简单就好 简单数据类型的操作通常需要更少的CPU周期.例如:整 ...

  5. Jquery事件和选择器 纠错

    1: 试题分析:该题考的是jQuery中事件绑定的知识.绑定事件用bind()方法,选项A是正确的绑定事件语法,因此是正确的答案.选项BCD的语法是错误的. 2: 试题分析:opacity 必需.规定 ...

  6. Micropython TPYBoard v102 温湿度短信通知器(基于SIM900A模块)

    前言 前段时间看了追龙2,感受就是如果你是冲着追龙1来看追龙2的话,劝你还是不要看了,因为追龙2跟追龙1压根没什么联系,给我的感觉就像是看拆弹专家似的,估计追龙2这个名字就是随便蹭蹭追龙1的热度来的. ...

  7. 自定义itemCheckView

    极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以 ...

  8. Linux学习之自动配置部署——初用expect

    主机A连接主机B 免密登陆 + 自动部署 expect实现自动的交互式任务 ——— send 向进程发送字符串(输入) ——— expect 从进程接受字符串 ——— spawn 启动新进程 ——— ...

  9. 【科研民工笔记2】Ubuntu 16.04 安装nvidia驱动

    我的主机是2060的显卡,用的是安装在U盘中的Ubuntu,开机进入后,因为没有安装驱动,所以界面看以来比较大. 通过手动方式,成功安装驱动,最终成功的方案使用的是run文件安装的方式. 1.手动下载 ...

  10. Mac安装Homebrew的那些事儿

    Mac安装Homebrew的那些事儿 最近小明刚换置了一个 Mac 本,想搭建一个属于自己的博客网站,需要用到 Node.js 环境,而Node.js 在 MacOS 中是由 Homebrew 进行安 ...