@SovietPower
2019-04-01T20:34:25.000000Z
字数 7864
阅读 1726
正睿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
图片挂了可以看这里。
给定的网格,给定这些位置是胜还是负。在位置有一个棋子,两人轮流向左或向上移动这个棋子,直到移到或。求谁能赢。
首先暴力算每个格子上的函数。打表发现,两行两列之后(从第三行第三列开始),每条对角线上的格子上的函数是相同的。所以暴力求出第二行第二列每个格子的函数即可。
给定堆糖,数量分别为。Alice和Bob轮流操作。每次可以吃掉最多的一堆,也可以每堆各吃掉一个。无法操作的人输,求谁能赢。
。
画这图累死了= = 虽然确实有点丑
假设有堆糖,把它画成这样。我们发现每次操作就是拿掉最左边一列或最下边的一行。那么可以看成,初始在,每次向右或向上走一步。
考虑求。边界位置的值显然为,且只有两种取值表示胜负。其余位置的都可以求出,但是复杂度会炸。
打表可以发现,除去最边上一层,同一条副对角线上的位置的值是相同的,即。
考虑若,的后继的后继会有这一必胜态,所以;若,则的后继存在必败态的后继,所以。
然后我们就可以找第一个满足的位置,求的值,即右边上边各有多少个位置有糖即可。
这个结论是很常用的结论:同一条对角线上的值相同。
https://www.cnblogs.com/SovietPower/p/10473317.html
有个石子,先手第一次可以取任意个,但不能一次全取完。之后每个人取的个数不能超过另一个人上次取的数量的倍,不能取的人输。求先手是否有必胜策略。如果有,求先手第一次最少需要取多少个。
我竟然做过。。毫无印象,而且牛客提高集训是出了道原题= =。但是思路貌似和下面说的不太一样(本质是一样的吧),可以看这里的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忘了啊而且不会(好像没听..)。
有共个数字,两个人轮流选一个数字删除,如果被删除了,那么也会一起被删除。求谁能赢。
。
我...我又忘了(当时好像也没听...)。
。见链接。
给定一棵个点的树,每个点是黑色或白色。两个人轮流操作,每次可以选一个白色的点,将它到根节点路径上的所有点染黑。不能操作的人输,求先手是否能赢。如果能,输出第一步选择哪些节点能赢。
。
Orz huzecong。
对于叶子节点,如果能染色,,否则。
考虑从下往上算每棵子树的值。设表示子树的值,表示对这棵子树操作能得到的后继的值集合(只考虑子树),那么。
考虑如何计算。令。
若是黑点,假设这次操作选了子树中的某个点,那么其它子树状态不变,子树的后继状态会变成中的某个,所以。
把子树内每个整体一个数,合并起来,就可以得到了。
若是白点,多了一种选的后继,选后得到状态的值就是。所以在中再插入一个即可。
还要支持求,可以用维护。合并的时候可以启发式合并,,也可以类似线段树合并做到。
对于第二问,考虑选择一个节点后局面的值。容易发现就是除去它到根节点路径上的点的所有点的值的异或和。
记表示除去到根节点路径上的点外,所有节点的值异或和,那么。选择后的各棵子树是独立的,局面的值就是(也可以直接的时候传个参)。
所以如果,选这个点就是必胜的。
这个值的最大值是啥啊...
注意要特判叶子的地方(尤其是Merge
,注意像线段树合并一样判下叶子)(我怎么老是写错...)。
https://www.cnblogs.com/SovietPower/p/10555664.html
的纸条,两人轮流操作,每次拿走相邻的两个,谁不能操作谁输。求中有多少个数做能使得先手必胜。
打表,然后利用找循环节(前一两行没规律,后面是循环的)。
Alice和Bob玩游戏。给定,表示有行的棋盘,每行有三个棋子。Alice每次可以选择一行将该行左边的一个或两个棋子往右移动步,Bob每次可以选择一行将该行右边的一个或两个棋子往左移动步。
要求移动时一个棋子不能跨越另一个棋子,且是质数或两个质数的乘积,且。求出Alice和Bob分别作为先手时,谁能赢。
。
右移一个棋子就是缩小第二三两个棋子之间的距离,右移两个棋子就是缩小一二两个棋子之间的距离。设三个棋子位置为,每一行实际就是两个棋子数为的游戏。
如果能算出棋子数为的游戏的函数,将个游戏的值全异或起来即可。考虑如何算,显然有,但是复杂度是的。
打个表发现,值最大不会超过(我也不知道怎么能得出的)。我们开个,分别表示每个数字是否存在值为的后继。再预处理的。这样从小到大求时,就for
一遍看它不存在哪个值的后继;然后即可(更新上能到的位置)。
复杂度。
https://www.cnblogs.com/SovietPower/p/10209994.html
每个点可以走到中的某个点,求每个点的值。
。
就是求区间。见BZOJ3585。
先预处理出区间的,更新到线段树上。把询问按左端点排序。考虑从到时,若,则中大于的全部会变成。给这个区间取即可。询问就是单点查询。
阶Nim游戏:有堆石子,每堆各有个石子。双方轮流操作,每次可以选堆石子,从选出的每堆中取走任意个(可以全取完)。取走最后一个石子的人赢。求谁能赢。
结论:当且仅当在二进制表示下的每一位上,的个数和是的倍数时,先手必败。否则先手必胜。
证明见这里。
有堆石头,三个人玩。拿走最后一个的是第一名,倒数第二个拿的是第二名,另一个是第三名。每个人都想使自己的名次最高,求最终三人的名次。
结论:最后一个人必胜,当且仅当把所有数字用二进制表示后,每一位上的数加起来模等于(类似普通的异或和)。
判断第一个人是否必胜就可以直接判断能否走到必胜态。
否则就是第二个人赢。
分析比较复杂...我又忘了...
有堆石子,两个人轮流取。每次可以在第堆中拿若干堆石头放到第堆中(),无法操作的人输。求谁能赢。
把奇数堆石子拿出来做游戏,先手必败当且仅当奇数堆石子数异或和为。
因为如果一个人操作偶数堆,另一个人可以将他移动的石子放到下一个偶数堆里去,不影响奇数堆的状态。然后讨论一下就可以得出这个结论了。
一个变形。
枚硬币排成一排,有的正面朝上,有的反面朝上。从左到右给硬币进行编号。
游戏者根据某些约束反硬币(如:每次只能翻或枚,或者每次只能翻连续的几枚),但他所翻动的硬币中,最右边的必须是从正面翻到反面。谁不能翻谁输。
有个结论:局面的值为局面中每个正面朝上的棋子单一存在时的值的异或和。如:SG[0100101]=SG[01]^SG[00001]^SG[0000001]
。其中表示正面朝上。(这样就只需要计算有个棋子,只有最后一个是的值,打表找规律)
连续翻任意个的游戏的函数,假设局面共个棋子,最右边为正其余为反,那么由上面的结论可以得到。
具体的见链接吧,很全。不想写了。
不想看。最后是个求矩形并。
给定一棵个节点的有根树,每个节点上有一个硬币。每次可以选择一个正面朝上的硬币,将它以及在它的所有后代中选一个子集翻转。不能操作的人输。求谁能赢。
课件:
每个硬币是独立的,证明见上。
只需要求出每个点的即可。
通过归纳可得,每个点的值为。
结论:叶节点的值为,非叶节点的值为,它所有子节点值加后的异或和。
具体见链接。
游戏:决策集合为空(局面中所有单一游戏的值为)的游戏者赢,其余规则与游戏相同。
定理:
对于游戏,如果我们规定当局面中所有单一游戏的值为时,游戏结束,则先手必胜当且仅当:
1. 游戏的函数不为且游戏中某个单一游戏的函数值大于
2. 游戏的函数为且没有某个单一游戏的函数值大于
有堆石子。除了第一堆外,每堆石子个数都不少于前一堆的石子个数。两人轮流操作,每次可以从一堆石子中拿掉任意多的石子,但要保证操作后仍然满足初始时的条件。谁没有石子可拿时输。求先手是否必胜。
限制条件就是相邻两个数的差非负。那么记查分数组。假设拿走第堆的个石子,影响是-=,+=,就相当于从中拿个给。
显然原题意和对差分数组做反向的阶梯是等价的,然后就做完啦。
https://www.cnblogs.com/SovietPower/p/10555645.html
有若干排石子,每一排又有若干堆石子。每次可以选择一排,取走这排最左边的一堆石子;每次可以选择一排,取走这排最右边的一堆石子。两个人都想最大化自己的石子数目,先手,求最后两人各有多少石子。
对于一排石子,假设有偶数堆,那么两人会各拿一半。因为能保证自己得分左边一半的和,能保证自己得分右边一半的和。(脑补一下好了)
如果是奇数,先手(先操作这一堆的人)可以取到最中间的石子。把所有奇数堆的排的中间那堆拿出来,排个序,两人一定会轮流从大到小取。
有一些数字,被分成若干双端队列(从两边都可以取)和最多两个栈(只能从某一边一个一个取)的形式。两人轮流取这些数字,每个人都想最大化自己取到的数字和,求最后两人各能取到多少。
。
对于最左边的栈,如果有,那么先手取了,后手一定会取走(如果赚,显然后手要取;如果不赚,先手可以取别的最后依旧让后手取走)。同样扩展到左边连续递减的一段,两人都是轮流取的(这样为奇数时,后手取可能就不赚了)。
最右边的栈同理。
然后能发现,谁能取到最左和最右边的数只与数字总个数有关,如果一共奇数个,先手可以同时取走最左和最右,否则后手可以。(nb...感觉真要证会很复杂)
那么我们就可以处理完左右递减的那一段了。剩下的等会再说。
考虑双端队列,如果有,且先手取走,那么后手一定去取,先手一定会取走,所以收益差是固定的,为。这里的先手是指取的人。那么我们就可以将这三个数压成一个数,去求收益差。
那么我们就可以将这种上凸的情况全合并掉,把序列变成只有递减的、递增的、下凸的三种情况,显然这三种一定是从大到小轮流选的。
这样合并两个栈,因为左边递减的已经合并了,也没有上凸情况了,所以只剩下递增情况了。同样和双端队列那些放一起轮流选就行了。
最后求出个差,知道总数就知道答案了。
注意合并后的元素是可能出现的,空位置要再开个数组判。
https://www.cnblogs.com/SovietPower/p/10566210.html
PS:
后面都懒得看咯(也没时间搞这个了)。
还剩下几道(或者十几)题以及。如果不退役还会来补哒。
积有结合律、交换律,对和有分配律。
咕咕了。
翻硬币,可以翻转以这个点为右下角的矩形。
不知道。
咕咕。
求出每行每列单独的值,然后乘一下。