codeforces 812 E. Sagheer and Apple Tree(树+尼姆博弈)
题目链接: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(树+尼姆博弈)的更多相关文章
- 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 博弈了. 那我们看非叶子层. 看叶子层的父亲层. 我们可以发现, 如果从 ...
- POJ 3321 Apple Tree(树状数组)
Apple Tree Time Limit: 2000MS Memory Lim ...
- POJ--3321 Apple Tree(树状数组+dfs(序列))
Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 22613 Accepted: 6875 Descripti ...
- POJ 3321:Apple Tree 树状数组
Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 22131 Accepted: 6715 Descr ...
- 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. ...
- Codeforces 812E Sagheer and Apple Tree
大致题意: 给你一颗树,这个树有下列特征:每个节点上有若干个苹果,且从根节点到任意叶子节点的路径长度奇偶性相同. 甲和乙玩(闲)游(得)戏(慌). 游戏过程中,甲乙轮流将任意一个节点的若干个苹果移向它 ...
- Codeforces 812E Sagheer and Apple Tree ——(阶梯博弈)
之前在bc上做过一道类似的阶梯博弈的题目,那题是移动到根,这题是移动到叶子.换汤不换药,只要和终态不同奇偶的那些位置做nim即可.因此这题给出了一个条件:所有叶子深度的奇偶性相同.同时需要注意的是,上 ...
- POJ 3321 Apple Tree 树状数组+DFS
题意:一棵苹果树有n个结点,编号从1到n,根结点永远是1.该树有n-1条树枝,每条树枝连接两个结点.已知苹果只会结在树的结点处,而且每个结点最多只能结1个苹果.初始时每个结点处都有1个苹果.树的主人接 ...
随机推荐
- JS 自执行函数
由于自己js基础知识薄弱,很多js的知识还没有掌握,所以接下来会经常写一些关于js基础知识的博客,也算给自己提个醒吧. js自执行函数,听到这个名字,首先会联想到函数.接下来,我来定义一个函数: fu ...
- JAVA开始(基础篇)
数据类型 Boolean 1位Byte 1个字节(8位)Short 2个字节Char 2个字节Int ...
- 跟着大彬读源码 - Redis 8 - 对象编码之字典
目录 1 字典的实现 2 插入算法 3 rehash 与 渐进式 rehash 总结 字典,是一种用于保存键值对的抽象数据结构.由于 C 语言没有内置字典这种数据结构,因此 Redis 构建了自己的字 ...
- v-text,v-html等区别
首先我们知道vue中有很多自定义指令,以v- 开头,例如:v-text,v-bind,v-model, v-if,等 在这些指令中,部分指令之间是很容易被混淆,所以今天决定自己总结一下以下几个相似指令 ...
- [Apache Pulsar] 企业级分布式消息系统-Pulsar快速上手
Pulsar快速上手 前言 如果你还不了解Pulsar消息系统,可以先看上一篇文章 企业级分布式消息系统-Pulsar入门基础 Pulsar客户端支持多个语言,包括Java,Go,Pytho和C++, ...
- 解决 Android 中出现依赖多个版本支持库的问题
在 app 的 build.gradle 中引入依赖时发现如下错误: All com.android.support libraries must use the exact same version ...
- javaweb基础整理随笔-----上传与下载步骤详解
这次整理的是上传与下载的原生代码解析: 上传:1.对页面的要求:enctype="multipart/form-data" method="post" ...
- 从源码看Flask框架配置管理
1 引言 Flask作为Python语言web开发的三大顶梁柱框架之一,对于配置的管理当然必不可少.一个应用从开发到测试到最后的产品发布,往往都需要多种不同的配置,例如是否开启调试模式.使用哪个数据库 ...
- (二十七)c#Winform自定义控件-多输入窗体
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- 理解Go协程与并发
协程 Go语言里创建一个协程很简单,使用go关键字就可以让一个普通方法协程化: package main import ( "fmt" "time" ) fun ...