Alice and Bob (SG函数)
来源:互联网 发布:做自己喜欢的 知乎 编辑:程序博客网 时间:2024/05/17 06:47
题目
Problem Description
给出一颗满二叉树,以及每个树节点上的石头数量
A和B轮流操作,每次选择一个节点,将其上的任意个石头推向它的儿子
不能不推,若选择的节点为叶节点,则被推的石头消失
A先手,要求输出在保证A必胜的前提下,A第一步有多少种走法
多组数据Input
第一行一个T,表示数据组数
每组数据先给出一个数n,表示二叉树有n层
接下来有n行,第i行有2^(i-1)个数,表示每个树节点上的石头数量T<=20,n<=15,其余的数<=10000000
Output
对每组数据输出一个数,表示有多少种走法
Sample Input
4
1
12
1
0 03
1
2 2
4 4 4 44
13
19 13
13 0 9 8
5 4 6 11 2 16 18 6Sample Output
1
0
6
7部分样例解释:
为方便理解已将每组数据隔开
将节点从上到下,从左到右依次编号
第一组仅有一种可能走法,即把一号点的一个石子下推
第二组A没有必胜策略,故走法为0
第三组的六种走法分别为
1~2:把一号点的石头下推,共两种
3~6:把二或三号点的石头下推一个,共四种Problem Source
玲珑杯 Round #9
分析
- 看完题,应该可以想到这也是一道SG函数题:可以把这课满二叉树上每个节点都看作一堆石子
- 不过我们会发现,标准的SG函数要求是每一堆石子都只减不增,可这道题里面除了最下面那一层的石子推完后会消失,其他地方的石子都会转移到下一层的节点上,这就意味着某一堆(不在最下面一层)减少了石子,就一定会有一堆(是这一堆的某个儿子节点)的石子数增加。
- 再想一想,就会想到,实际上我们可以把这棵树分成两部分:奇数层和偶数层,这样对于奇偶性相同的每一层,我们可以把它们看成只减不增的(若某人推了些石子到某个节点,那么你可以把它们推到下一层(奇偶性就不同了))。
- 题目要求求出先手想赢,第一步有多少种方案,我们就可以想象成移掉某个节点之后,再开始游戏,此时就是要求后手(即原来的先手)赢了。也就是说,先求出一个给定奇偶性(我的程序中选的是与最底层奇偶相同的层)层上的节点SG值的抑或值,再枚举那个奇偶性的层上所有节点,看看它的SG值改成几可以满足抑或值为0。
- 注意一下,每个节点对答案的贡献有两类情况:
# 情况 讨论 操作 1 当前节点需要增加石子数 那么肯定是从它的父节点推下来的石子 要是它父节点石子足够多,那么答案+1 2 当前节点需要减少石子 那么肯定是把当前节点的石子推到它的儿子节点 要是它在最底层,那么答案+1;否则+2(两个儿子节点都可以推)* 对了有一点很重要,由于每个节点石头可以推走任意个,所以对于每个石头数
n
,不难看出SG(n)=n ,所以程序里我就直接把 SG[a[k]] 写成 a[k]了。
程序
#include <cstdio>#define For(x) for (int k=1<<(x-1),o=1<<x; k<o; k++) //枚举第x层的节点 k int a[100000],n,T,s,ans; //s:所有节点SG函数的抑或值 int main(){ scanf("%d",&T); while (T--){ s=0,ans=0; scanf("%d",&n); for (int i=1,o=1<<n; i<o; i++) scanf("%d",&a[i]); for (int i=n; i>0; i-=2) For (i) s^=a[k]; for (int i=n; i>0; i-=2) For (i){ int aim=s^a[k]; //此节点SG函数需要被改成 aim if (aim<a[k]) ans+=(i==n ? 1:2); //需要减少时,要是是最底层的节点那就只有一个贡献(只能将石头"推下悬崖"),否则有两个贡献(左右儿子) else if (aim>a[k] && a[k>>1]>=aim-a[k]) ans+=1; //需要增加时,只有它的父节点有足够的石子移给这,才对答案有贡献 } printf("%d\n",ans); } return 0;}
- SG函数 Alice and Bob
- Alice and Bob (SG函数)
- zoj 3666 Alice and Bob , SG函数
- Alice and Bob 题解 SG函数
- ZOJ 3666 Alice and Bob(博弈 sg 函数入门)
- Acdream 1112 Alice and Bob(sg函数)
- hdu 4111 Alice and Bob 博弈论 sg函数
- ACdream 1112 Alice and Bob (SG函数)
- hdu4111 Alice and Bob---sg dp记忆化求sg
- ZOJ 3529 A Game Between Alice and Bob(博弈论-sg函数)
- ACdream 1112 Alice and Bob (SG函数+线性素数筛)
- ZOJ Problem Set - 3666 Alice and Bob(SG)
- Alice and Bob
- 2683. Alice and Bob
- 1798. Alice and Bob
- hdu4268 Alice and Bob
- HDU4268 Alice and Bob
- Alice, Bob and Chocolate
- 为你的EditText添加一个烟花效果
- C语言浅谈unsigned和siged
- 田忌赛马 poj 2287 (贪心,动态规划,贪心+动态规划)
- Matlab常用小技巧—注释,快捷键总结
- matlab命令窗口双大于号>>不显示了 回车命令不管用了,怎么改才能恢复
- Alice and Bob (SG函数)
- ES内存优化
- 一个退学博士生的感想【转】
- 什么叫4K对齐、如何进行硬盘4K对齐?
- selenium2java 遇到有三个窗口用例的处理办法
- linux指令(stat date cal)
- 机器学习(Machine Learning)和深入学习(Deep Learning)资料
- c3p0和QueryRunner的结合使用,让开发更加简便
- webdriver中的等待问题