大致题意:

给你一颗树,这个树有下列特征:每个节点上有若干个苹果,且从根节点到任意叶子节点的路径长度奇偶性相同。

甲和乙玩(闲)游(得)戏(慌)。

游戏过程中,甲乙轮流将任意一个节点的若干个苹果移向它的一个叶子节点,若没有叶子节点,那么这些苹果就消失了(被吃掉了)。

若一个玩家没法操作,那么算他输。

游戏由甲开始,而乙可以先选择将两个节点上的苹果数交换一下。问乙有多少种交换方式,使得最后乙获胜。

Nim游戏:

如果懂Nim游戏的话,就不要看了\(^o^)/~你肯定会这道题了。

懂Nim游戏的定义,不懂证明的孩子们,跳过6行往下看。

这6行是写给萌新的

让懒惰的我摘录一段百度百科的话

让我们来看一下美妙绝伦的结论:

简单来说,只要把每一堆的石子数全部xor起来,最后得到0,则后手有必胜策略,否则先手有必胜策略。

Nim游戏结论证明:

不想看证明,想看本题做法的,跳过13行往下看。

让我来描述一下,假如xor起来是0的话,后手的必胜策略。

我们先设每一堆石头数全部xor起来,得到的结果是p。

一开始p=0。

假如先手选中一堆石头,这一堆石头数为x,他拿走了一些石头,剩余石头数为y。

那么我们记 t=x^y。

容易知道,t≠0,先手操作之后,p=t≠0。

于是,容易知道,后手一定能找到一堆石头(石头数为a),满足a^t<a,

因为一定能找到一个a,它与t的二进制最高位都为1。(这点都理解不了就放弃OI吧……好吧开个玩笑)

那么,后手将a变为a^t之后,p重新变为0。

于是,先手操作之后,p永远不为0,后手操作之后,p永远都是0。而游戏并不是永无止境的,所以一定是后手赢。

那么,假设一开始p≠0,先手策略是什么呢?

显而易见,就是找一堆石头(石头数为a),满足a^p<a,

先手将a变成a^p,使得p变为0。接着跟后手策略一样做即可。

本题做法:

也许当该游戏的玩家Sagheer and Soliman知道互相都使用必胜策略的话,他们也就不会喜欢玩这个游戏了。

因为,一开始游戏的局面决定了,谁能赢

let me see——

题目中有一个非常好的条件

于是本题就从非常难变成了非常简单。

设,d[x]表示x到该子树中某一个叶子节点的路径长度的奇偶性。(0表示偶数,1表示奇数)

假如后手一开始不能交换节点,那么后手策略可以是这样:

假设d值为1的点属于集合1,d值为0的点属于集合0。

①:先手将集合1中的点x的y个苹果往下移到了z,

那么我们知道d[z]=0,则后手可以将z的y个苹果往下移

②假如把集合0中的点列出来,那么这就是一个典型的Nim游戏。

只要这些点上的苹数xor起来的值p=0,后手就能赢。

回到原题:后手一开始有机会交换两个节点。

假设p=0,后手可以交换集合0中的任意两个点,或集合1中的任意两个点。

否则,肯定要将集合0中的一个点与集合1中的一个点交换了。

弄一个桶,枚举ok。

代码:

 #include <cstdio>
#include <iostream>
using namespace std;
#define ref(i,x,y)for(int i=x;i<=y;++i)
int read(){
char c=getchar();int d=,f=;
for(;c<''||c>'';c=getchar())if(c=='-')f=-;
for(;c>=''&&c<='';d=d*+c-,c=getchar());
return d*f;
}
const int N=,M=;
int n,cnt,t[M],d[N],a[N],head[N],to[N],nxt[N];
void addedge(int x,int y){
++cnt;to[cnt]=y;nxt[cnt]=head[x];head[x]=cnt;
}
void dfs(int x){
for(int i=head[x];i;i=nxt[i]){
dfs(to[i]);
d[x]=d[to[i]]^;
}
}
int main()
{
n=read();
ref(i,,n)a[i]=read();
ref(i,,n)addedge(read(),i);
dfs();
int tmp=,tot=;
long long ans=;
ref(i,,n)if(!d[i])tmp^=a[i];
ref(i,,n)if(d[i])t[a[i]]++,tot++;
if(tmp==)ans=1LL*tot*(tot-)/+1LL*(n-tot)*(n-tot-)/;
ref(i,,n)if(!d[i])ans+=t[tmp^a[i]];
printf("%lld\n",ans);
}

Codeforces 812E 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. Codeforces 812E Sagheer and Apple Tree ——(阶梯博弈)

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

  4. codeforces 812 E. Sagheer and Apple Tree(树+尼姆博弈)

    题目链接:http://codeforces.com/contest/812/problem/E 题意:有一颗苹果树,这个苹果树所有叶子节点的深度要不全是奇数,要不全是偶数,并且包括根在内的所有节点上 ...

  5. Codeforces 348B - Apple Tree

    348B - Apple Tree 我们设最后答案为 x , 我们我们就能用x表示出所有节点下面的苹果个数, 然后用叶子节点求lcm, 取最大的可行解. #include<bits/stdc++ ...

  6. cf202-div 1-B - Apple Tree:搜索,数论,树的遍历

      http://codeforces.com/contest/348/problem/B   B. Apple Tree time limit per test 2 seconds memory l ...

  7. POJ 2486 Apple Tree

    好抽象的树形DP......... Apple Tree Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6411 Accepte ...

  8. poj 3321:Apple Tree(树状数组,提高题)

    Apple Tree Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 18623   Accepted: 5629 Descr ...

  9. poj 3321 Apple Tree dfs序+线段树

    Apple Tree Time Limit: 2000MS   Memory Limit: 65536K       Description There is an apple tree outsid ...

随机推荐

  1. beta冲刺2-咸鱼

    q前言:今天晚上大概把github的的相关东西弄上了.然后把之前做的一些修改什么的也上传上去了.目测之后的话就是在自己这边改完然后直接上github那边去复制粘贴替换掉了. 昨天的问题:github这 ...

  2. 【Alpha】咸鱼冲刺日记第一天-黄紫仪

    总汇链接 一,合照 emmmmm.自然是没有的. 二,项目燃尽图 emmmmm,事实上它还没有正式开始.所以依旧没有[突然觉得明天任务真重] 三,项目进展 emmmmm,我错了咸鱼了两天才突然反应过来 ...

  3. Linux 复习

    shift + control + +  终端窗口放大 control + -   终端窗口缩小 ls -alh > laowang.txt 重定向,并覆盖源文件内容 ls -alh >& ...

  4. NetFPGA-1G-CML从零开始环境配置

    NetFPGA-1G-CML从零开始环境配置 前言 偶得一块NetFPGA-1G-CML,跟着github对NetFPGA-1G-CML的入门指南,一步步把配置环境终于搭建起来,下面重新复现一下此过程 ...

  5. JAVA中最容易让人忽视的基础。

    可能很多找编程工作的人在面试的时候都有这种感受,去到一个公司填写面试试题的时候,多数人往往死在比较基础的知识点上.不要奇怪,事实就是如此一般来说,大多数公司给出的基础题大概有122道,代码题19道左右 ...

  6. hp MSA50 5盘RAID5重建为4盘RAID5怎么恢复数据

    [用户单位] XX省电视台[数据恢复故障描述] 一台HP 服务器,挂接一台HP MSA50磁盘阵列,内接5块1TB硬盘,原先结构为RAID5. 使用一段时间后,其中一块硬盘掉线,因RAID5支持一块硬 ...

  7. c# 运算符:? ,??

    参考微软帮助 1  ?  空值条件运算符,用于在执行成员访问 (?.) 或索引 (?[) 操作之前,测试是否存在 NULL. // ? 空值条件运算符 string str = null; Conso ...

  8. python使用tesseract-ocr完成验证码识别(模型训练和使用部分)

    一.Tesseract训练 大体流程为:安装jTessBoxEditor -> 获取样本文件 -> Merge样本文件 –> 生成BOX文件 -> 定义字符配置文件 -> ...

  9. MSIL实用指南-一维数组的操作

    本篇讲解怎么生成和操作一维数组.各种数组类型创建的步骤是一样的,但是加载和保存步骤有所不同. 一.创建数组所有类型的一维数组创建都是一样的,分三步.1.加载数组长度2.生成指令 Newarr < ...

  10. AngularJS1.X学习笔记10-自定义指令(下)

    继续继续,学完这个部分就去吃饭.引用自由男人的话作为本文的开始:“默认情况下,链接函数被传入了控制器的作用域,而该控制器管理着的视图包含了指令所应用到的元素”.果然像是绕口令,还是看看你的例子比较好. ...