[关闭]
@SovietPower 2019-04-01T20:34:25.000000Z 字数 7864 阅读 1726

3.2 青岛正睿 Day3 博弈

正睿OI



[POI2009]KAM-Pebbles
PA 2009:https://www.lydsy.com/JudgeOnline/problem.php?id=2000
下面的某道类似的例题:https://www.cnblogs.com/SovietPower/p/9879090.html
不平等博弈 例题1:https://www.cnblogs.com/SovietPower/p/9851581.html
不平等博弈 例题2:TCO17 Final 450

图片挂了可以看这里


某道题


给定的网格,给定这些位置是胜还是负。在位置有一个棋子,两人轮流向左或向上移动这个棋子,直到移到。求谁能赢。

首先暴力算每个格子上的函数。打表发现,两行两列之后(从第三行第三列开始),每条对角线上的格子上的函数是相同的。所以暴力求出第二行第二列每个格子的函数即可。


AGC 002E.Candy Piles(博弈论)


给定堆糖,数量分别为。Alice和Bob轮流操作。每次可以吃掉最多的一堆,也可以每堆各吃掉一个。无法操作的人输,求谁能赢。



画这图累死了= = 虽然确实有点丑
假设有堆糖,把它画成这样。我们发现每次操作就是拿掉最左边一列或最下边的一行。那么可以看成,初始在,每次向右或向上走一步。
考虑求。边界位置的值显然为,且只有两种取值表示胜负。其余位置的都可以求出,但是复杂度会炸。
打表可以发现,除去最边上一层,同一条副对角线上的位置的值是相同的,即
考虑若的后继的后继会有这一必胜态,所以;若,则的后继存在必败态的后继,所以
然后我们就可以找第一个满足的位置,求值,即右边上边各有多少个位置有糖即可。
这个结论是很常用的结论:同一条对角线上的值相同。
https://www.cnblogs.com/SovietPower/p/10473317.html


POJ.3922.A simple stone game(K倍减法游戏 博弈论)


个石子,先手第一次可以取任意个,但不能一次全取完。之后每个人取的个数不能超过另一个人上次取的数量的倍,不能取的人输。求先手是否有必胜策略。如果有,求先手第一次最少需要取多少个。

我竟然做过。。毫无印象,而且牛客提高集训是出了道原题= =。但是思路貌似和下面说的不太一样(本质是一样的吧),可以看这里的C题

https://blog.csdn.net/ta201314/article/details/44892055
http://www.cnblogs.com/jianglangcaijin/archive/2012/12/19/2825539.html

上面两个都写的不错,我懒得写了。。
大体就是,时,可以证明当且仅当石子数为时先手必败;时,是Fibonacci博弈,可以证明当且仅当是斐波那契数时先手必败。证明过程都类似。
推广到,同样构造数列,令,即令数列中相邻两项的比值不小于。胜负就判断是否存在即可。
然而说的是,暴力三方DP->单调性优化到平方->数据结构优化到线性...?但是毕竟还是的。。


五个函数的小练习


1. 有一堆石子,两人轮流取,每次可以取个,谁不能取谁输。求谁能赢。
2. 有一堆石子,两人轮流取,每次可以取个,谁不能取谁输。求谁能赢。
3. 有堆石子,两人轮流取,每次可以在一堆石子里选任意多的石头,或者把一堆石头分裂成两堆,谁不能操作谁输。求谁能赢。(
4. 游戏,有一个数,每次能拿掉当前数的一个因子(除去它本身,将当前数减掉这个因子)。
5. 游戏,每次能拿掉与当前数互质的一个数。

1.
2.
找到规律,再用归纳证明...
3. 一个游戏分裂成两个独立的游戏,值就是两个游戏的值异或起来:
然后打表能发现规律。见这道题
4. 找规律发现是__builtin_ctz(n)(二进制后缀的个数)。
5. 找规律。发现最小质因数的编号。


某道题


给定两个字符串每次可以删掉最前面或最后面的一个字符。若一个人操作后变成了的子串,该人输。求谁能赢。

我...我个zz忘了啊而且不会(好像没听..)。


CF某题


个数字,两个人轮流选一个数字删除,如果被删除了,那么也会一起被删除。求谁能赢。


我...我又忘了(当时好像也没听...)。


某题...

。见链接


SPOJ COT3.Combat on a tree(博弈论 Trie合并)


给定一棵个点的树,每个点是黑色或白色。两个人轮流操作,每次可以选一个白色的点,将它到根节点路径上的所有点染黑。不能操作的人输,求先手是否能赢。如果能,输出第一步选择哪些节点能赢。


Orz huzecong

对于叶子节点,如果能染色,,否则
考虑从下往上算每棵子树的值。设表示子树的值,表示对这棵子树操作能得到的后继的值集合(只考虑子树),那么

考虑如何计算。令
是黑点,假设这次操作选了子树中的某个点,那么其它子树状态不变,子树的后继状态会变成中的某个,所以
把子树内每个整体一个数,合并起来,就可以得到了。
是白点,多了一种选的后继,选后得到状态的值就是。所以在中再插入一个即可。

还要支持求,可以用维护。合并的时候可以启发式合并,,也可以类似线段树合并做到

对于第二问,考虑选择一个节点后局面的值。容易发现就是除去它到根节点路径上的点的所有点的值的异或和。
表示除去到根节点路径上的点外,所有节点的值异或和,那么。选择的各棵子树是独立的,局面的值就是也可以直接的时候传个参)。
所以如果,选这个点就是必胜的。

这个值的最大值是啥啊...
注意要特判叶子的地方(尤其是Merge,注意像线段树合并一样判下叶子)(我怎么老是写错...)。
https://www.cnblogs.com/SovietPower/p/10555664.html


Project Euler 306(打表)


的纸条,两人轮流操作,每次拿走相邻的两个,谁不能操作谁输。求中有多少个数做能使得先手必胜。

打表,然后利用找循环节(前一两行没规律,后面是循环的)。


Goodbye 2018.H.New Year and the Tricolore Recreation(博弈论 bitset)


Alice和Bob玩游戏。给定,表示有行的棋盘,每行有三个棋子。Alice每次可以选择一行将该行左边的一个或两个棋子往右移动步,Bob每次可以选择一行将该行右边的一个或两个棋子往左移动步。
要求移动时一个棋子不能跨越另一个棋子,且是质数或两个质数的乘积,且。求出Alice和Bob分别作为先手时,谁能赢。


右移一个棋子就是缩小第二三两个棋子之间的距离,右移两个棋子就是缩小一二两个棋子之间的距离。设三个棋子位置为,每一行实际就是两个棋子数为游戏。
如果能算出棋子数为的游戏的函数,将个游戏的值全异或起来即可。考虑如何算,显然有,但是复杂度是的。
打个表发现,值最大不会超过(我也不知道怎么能得出的)。我们开,分别表示每个数字是否存在值为的后继。再预处理。这样从小到大求时,就for一遍看它不存在哪个值的后继;然后即可(更新上能到的位置)。
复杂度
https://www.cnblogs.com/SovietPower/p/10209994.html


某道数据结构题(求区间mex)


每个点可以走到中的某个点,求每个点的值。


就是求区间。见BZOJ3585
先预处理出区间的,更新到线段树上。把询问按左端点排序。考虑从时,若,则大于的全部会变成。给这个区间取即可。询问就是单点查询。


N阶Nim


阶Nim游戏:有堆石子,每堆各有个石子。双方轮流操作,每次可以选堆石子,从选出的每堆中取走任意个(可以全取完)。取走最后一个石子的人赢。求谁能赢。

结论:当且仅当在二进制表示下的每一位上,的个数和是的倍数时,先手必败。否则先手必胜。
证明见这里


三人Nim游戏


堆石头,三个人玩。拿走最后一个的是第一名,倒数第二个拿的是第二名,另一个是第三名。每个人都想使自己的名次最高,求最终三人的名次。

结论:最后一个人必胜,当且仅当把所有数字用二进制表示后,每一位上的数加起来模等于(类似普通的异或和)。
判断第一个人是否必胜就可以直接判断能否走到必胜态。
否则就是第二个人赢。
分析比较复杂...我又忘了...


阶梯Nim


堆石子,两个人轮流取。每次可以在第堆中拿若干堆石头放到第堆中(),无法操作的人输。求谁能赢。

把奇数堆石子拿出来做游戏,先手必败当且仅当奇数堆石子数异或和为
因为如果一个人操作偶数堆,另一个人可以将他移动的石子放到下一个偶数堆里去,不影响奇数堆的状态。然后讨论一下就可以得出这个结论了。
一个变形


翻硬币游戏


枚硬币排成一排,有的正面朝上,有的反面朝上。从左到右给硬币进行编号
游戏者根据某些约束反硬币(如:每次只能翻枚,或者每次只能翻连续的几枚),但他所翻动的硬币中,最右边的必须是从正面翻到反面。谁不能翻谁输。

有个结论:局面的值为局面中每个正面朝上的棋子单一存在时的值的异或和。如:SG[0100101]=SG[01]^SG[00001]^SG[0000001]。其中表示正面朝上。(这样就只需要计算有个棋子,只有最后一个是值,打表找规律)
连续翻任意个的游戏的函数,假设局面共个棋子,最右边为正其余为反,那么由上面的结论可以得到
具体的见链接吧,很全。不想写了。


CF.494E.Sharti


不想看。最后是个求矩形并。


树上翻硬币


给定一棵个节点的有根树,每个节点上有一个硬币。每次可以选择一个正面朝上的硬币,将它以及在它的所有后代中选一个子集翻转。不能操作的人输。求谁能赢。

课件:

每个硬币是独立的,证明见上。
只需要求出每个点的即可。
通过归纳可得,每个点的值为


树上删边游戏

结论:叶节点的值为,非叶节点的值为,它所有子节点值加后的异或和。
具体见链接


Anti-SG


游戏:决策集合为空(局面中所有单一游戏的值为)的游戏者赢,其余规则与游戏相同。

定理:
对于游戏,如果我们规定当局面中所有单一游戏的值为时,游戏结束,则先手必胜当且仅当:
1. 游戏的函数不为且游戏中某个单一游戏的函数值大于
2. 游戏的函数为且没有某个单一游戏的函数值大于


BZOJ.1115.[POI2009]石子游戏Kam(阶梯博弈)


堆石子。除了第一堆外,每堆石子个数都不少于前一堆的石子个数。两人轮流操作,每次可以从一堆石子中拿掉任意多的石子,但要保证操作后仍然满足初始时的条件。谁没有石子可拿时输。求先手是否必胜。

限制条件就是相邻两个数的差非负。那么记查分数组。假设拿走第堆的个石子,影响是-=+=,就相当于从中拿个给
显然原题意和对差分数组做反向的阶梯是等价的,然后就做完啦。
https://www.cnblogs.com/SovietPower/p/10555645.html


CF.388C.Fox and Card Game(博弈)


有若干排石子,每一排又有若干堆石子。每次可以选择一排,取走这排最左边的一堆石子;每次可以选择一排,取走这排最右边的一堆石子。两个人都想最大化自己的石子数目,先手,求最后两人各有多少石子。

对于一排石子,假设有偶数堆,那么两人会各拿一半。因为能保证自己得分左边一半的和,能保证自己得分右边一半的和。(脑补一下好了)
如果是奇数,先手(先操作这一堆的人)可以取到最中间的石子。把所有奇数堆的排的中间那堆拿出来,排个序,两人一定会轮流从大到小取。


BZOJ.2000.[HNOI2010]stone取石头游戏(博弈)


有一些数字,被分成若干双端队列(从两边都可以取)和最多两个栈(只能从某一边一个一个取)的形式。两人轮流取这些数字,每个人都想最大化自己取到的数字和,求最后两人各能取到多少。


对于最左边的栈,如果有,那么先手取了,后手一定会取走(如果赚,显然后手要取;如果不赚,先手可以取别的最后依旧让后手取走)。同样扩展到左边连续递减的一段,两人都是轮流取的(这样为奇数时,后手取可能就不赚了)。
最右边的栈同理。
然后能发现,谁能取到最左和最右边的数只与数字总个数有关,如果一共奇数个,先手可以同时取走最左和最右,否则后手可以。(nb...感觉真要证会很复杂)
那么我们就可以处理完左右递减的那一段了。剩下的等会再说。

考虑双端队列,如果有,且先手取走,那么后手一定去取,先手一定会取走,所以收益差是固定的,为。这里的先手是指取的人。那么我们就可以将这三个数压成一个数,去求收益差。
那么我们就可以将这种上凸的情况全合并掉,把序列变成只有递减的、递增的、下凸的三种情况,显然这三种一定是从大到小轮流选的。

这样合并两个栈,因为左边递减的已经合并了,也没有上凸情况了,所以只剩下递增情况了。同样和双端队列那些放一起轮流选就行了。

最后求出个差,知道总数就知道答案了。

注意合并后的元素是可能出现的,空位置要再开个数组判。
https://www.cnblogs.com/SovietPower/p/10566210.html


PS:
后面都懒得看咯(也没时间搞这个了)。
还剩下几道(或者十几)题以及。如果不退役还会来补哒。


Nim积

积有结合律、交换律,对有分配律。
咕咕了。


小练习 矩形翻硬币


翻硬币,可以翻转以这个点为右下角的矩形。

不知道。


Project Euler 459


咕咕。

求出每行每列单独的值,然后乘一下。






添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注