Codeforces 812E Sagheer and Apple Tree
大致题意:
给你一颗树,这个树有下列特征:每个节点上有若干个苹果,且从根节点到任意叶子节点的路径长度奇偶性相同。
甲和乙玩(闲)游(得)戏(慌)。
游戏过程中,甲乙轮流将任意一个节点的若干个苹果移向它的一个叶子节点,若没有叶子节点,那么这些苹果就消失了(被吃掉了)。
若一个玩家没法操作,那么算他输。
游戏由甲开始,而乙可以先选择将两个节点上的苹果数交换一下。问乙有多少种交换方式,使得最后乙获胜。
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的更多相关文章
- codeforces 812E Sagheer and Apple Tree(思维、nim博弈)
codeforces 812E Sagheer and Apple Tree 题意 一棵带点权有根树,保证所有叶子节点到根的距离同奇偶. 每次可以选择一个点,把它的点权删除x,它的某个儿子的点权增加x ...
- CodeForces 812E Sagheer and Apple Tree 树上nim
Sagheer and Apple Tree 题解: 先分析一下, 如果只看叶子层的话. 那么就相当于 经典的石子问题 nim 博弈了. 那我们看非叶子层. 看叶子层的父亲层. 我们可以发现, 如果从 ...
- Codeforces 812E Sagheer and Apple Tree ——(阶梯博弈)
之前在bc上做过一道类似的阶梯博弈的题目,那题是移动到根,这题是移动到叶子.换汤不换药,只要和终态不同奇偶的那些位置做nim即可.因此这题给出了一个条件:所有叶子深度的奇偶性相同.同时需要注意的是,上 ...
- codeforces 812 E. Sagheer and Apple Tree(树+尼姆博弈)
题目链接:http://codeforces.com/contest/812/problem/E 题意:有一颗苹果树,这个苹果树所有叶子节点的深度要不全是奇数,要不全是偶数,并且包括根在内的所有节点上 ...
- Codeforces 348B - Apple Tree
348B - Apple Tree 我们设最后答案为 x , 我们我们就能用x表示出所有节点下面的苹果个数, 然后用叶子节点求lcm, 取最大的可行解. #include<bits/stdc++ ...
- cf202-div 1-B - Apple Tree:搜索,数论,树的遍历
http://codeforces.com/contest/348/problem/B B. Apple Tree time limit per test 2 seconds memory l ...
- POJ 2486 Apple Tree
好抽象的树形DP......... Apple Tree Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6411 Accepte ...
- poj 3321:Apple Tree(树状数组,提高题)
Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 18623 Accepted: 5629 Descr ...
- poj 3321 Apple Tree dfs序+线段树
Apple Tree Time Limit: 2000MS Memory Limit: 65536K Description There is an apple tree outsid ...
随机推荐
- sql with as 用法-Z
以下内容转自:http:.com/ 一.WITH AS的含义 WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个 ...
- xcode修改代码目录结构出现clang:error:nosuchfileordirectory解决方法
需要迁移一个开源工程的一部分内容到自己工程,迁移对方的工程到自己工程之后,因目录结构配置整理需要,对嵌入的工程目录进行了结构改变,编译后出现: clang: error: no such file o ...
- servlet线程同步问题-代码实现同步(转)
从servlet的生命周期中,我们知道,当第一次访问某个servlet后,该servlet的实例就会常驻 内存,以后再次访问该servlet就会访问同一个servlet实例,这样就带来多个用户去访问一 ...
- 利用java反射读写csv中的数据
前一段有个需求需要将从数据库读取到的信息保存到csv文件中,在实现该需求的时候发现资料比较少,经过收集反射和csv相关资料,最终得到了如下程序. 1.在使用java反射读取csv文件数据时,先通 ...
- it's a big trick
今天,正式的登上了我注册已久的博客园,最初注册园子得出发点是记录生活点滴和学习工作的心得的,那就不忘初心,从头开始吧. 从校园到工作,从东北到南方 我们毕业啦 谁说毕业遥遥无期,转眼就要各奔东西. 是 ...
- LDAP的用户需求
使用LDAP(ApacheDS)构建统一认证服务(SSO单点登录) 构建团队协作的体系,需要涉及很多个系统,如SVN.Jenkins.Trac.Nexus等,而一般而言每个系统均有其用户体系,当我 ...
- MYSQL之视图、触发器、存储过程、函数、事物、数据库锁和数据库备份
一.视图 -- view 视图:是一个虚报表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据. 视图有如下特点: 1.视图的列可以来自不同的表,是表的抽象和逻辑意义上建立的新关系 ...
- Asp.Net Core 2.0 项目实战(8)Core下缓存操作、序列化操作、JSON操作等Helper集合类
本文目录 1. 前沿 2.CacheHelper基于Microsoft.Extensions.Caching.Memory封装 3.XmlHelper快速操作xml文档 4.Serializatio ...
- TSQL:判定一段数组连续的数字段有多少的方案
给定了一列数字,需要判定该列中连续的数据字有多少条记录: field1,field2 , , , , , create table tbl( field1 int, field2 int ) ,); ...
- c#获取网络时间并同步本地时间
通过TCP形式来获取NTP时间.主要代码如下: [DllImport("kernel32.dll")] private static extern bool SetLocalTim ...