博弈论
博弈论记录。
经典问题
阶梯
有一个从左到右编号为 的序列,每个位置上有一些石头。每次可以选择将一个位置上的若干石头移到左边相邻的一格。不能动的人输。
结论:偶数位置的 。
证明:把偶数位置的移入奇数位置相当于取走;把奇数位置的移入偶数位置,下一个人可以把它又重新移到奇数位置。
规则同普通 ,但是谁拿了最后的谁输。
结论:
如果每堆石子都只有一个,则 为偶数时先手必胜。
否则,若石子数的异或和不为 ,先手必胜。
证明:
全为 的情形显然。
如果现在至少存在 堆 的,且异或和 ,那么:
- 恰好只有 堆 石子数 的,可以直接考虑操作成全 的,且剩下的 的奇偶性可以任意操作;
- 石子数 的多于 堆,一定有一种方式使得拿完后至少存在 堆 ,且异或和为 。
这样说明了必胜态可达必败态。
如果现在至少存在 堆 的,且异或和 ,那么显然石子数量 的多于 堆,一定不存在拿完后石子数全为 ,且不存在拿完后异或和为 的情况。
这样说明了必败态不可达必败态。
结论得证。
由此引出 (?): 值和原来一样,但是先手必胜条件变为:
如果每个游戏的 值都是 ,则 为偶数时先手必胜。
否则,若 的异或和不为 ,先手必胜。
不知道是叫 还是叫 的东西
巴什博弈的拓展。
有 堆石子,每次可以选不超过 堆,从每堆拿走若干个。不能动的人输。
结论:对于每个二进制位,如果每一位都满足有 个在这位是 且 ,则先手必败,否则先手必胜。
证明:见拓展。
拓展:
有若干个 可能不同 的公平组合游戏(其实平凡的 和也适用于不同游戏,但我们接下来要说明 和是这个拓展的子情况 ),每次可以在最多 个游戏中同时操作一步,率先动不了了的人输。
结论:总 值计算方法如下:
将每个子游戏的 值用二进制表示,然后把这些二进制数当成 进制数。对这些 进制数做 进制不进位加法,得到的值即为总的 。
证明:
值的 性质可以让我们把子游戏看成拿石头。
首先,总状态的 是没办法转移到我们得到的这个答案的。因为每次最多选 个游戏。
同时, 这段数都是可以选出的,下面给出构造:
首先找到需要变的最高位。选择若干这一位为 的数,把这些数的这一位变成 。
然后每选完一位,设当前总共选了 个位置,首先可以把这些位置的下一位强制设为 ,接下来考虑下一位在模 意义下变成所需值需要减的 的个数为 。显然有 。此时有 种情况:
-
,说明选的还不够。在下一位选 个为 的位置变成 即可。
-
,选部分已选的位置把这些位置的当前位变为 即可。
每做完一位,就把所有已选位置的下一位设为 ,这样就能保证每次都是能选的。
所以我们一定能构造出 这些,这也说明了 值是对的。
Every-SG
有 个游戏同时进行,轮流玩,每次玩所有没结束的游戏。
最后一个结束的游戏的胜负就是总的胜负。
这个问题不好直接说结论,接下来进行一些说明。
考虑一个人在一个游戏里必胜,那么他一定得赢,且拖得越久越好;
如果他必输,那就要尽可能速战速决。
如此我们可以算出一个步数函数 。若这个状态为必胜状态,则 这个状态的所有必败后继的 ,如果这个状态是必败态,则 这个状态的所有后继的 。当然已经失败的状态 。
这样的话,先手必胜的条件就是所有子游戏中最大的 是奇数。
Multi-SG
堆石子,每次可以选一堆,拿走一些或分成两个非空堆。谁不能操作谁输。
结论:
谁爱证谁证。
一些套路
简单套路
总状态数(总转移数)很小,直接暴力有向图博弈。 (CF919F)
SG 函数
就是按照定义大力算 啊,最套路的一个东西了。
CF138D World of Darkraft
由于人类一般喜欢横平竖直,所以我们把这个棋盘转个 。由于原棋盘的黑色和白色部分是相互独立的,且这两个问题完全相同,所以这里只考虑其中一个。
设 表示左上角为 ,右下角为 的 值,计算就是枚举选其中的哪个,然后把这个矩形切成若干个部分,把这些部分的 异或,再对所有取个 即可。
CF1585G Poachers
考虑对于每个子树,维护出它所有后继状态的 值。就是对于每个深度求 值。
然后对于一个节点,有以下 种情况:
- 没有儿子,此时它的后继只有空节点。
- 一个儿子,直接继承儿子的状态数组,再加上一个新的。求 就是继承儿子的指针,暴力向后扫,因为 是有单调性的,所以可以这样均摊 地做。
- 两个儿子,直接对所有有用的数组暴力计算 再取 ,复杂度同启发式合并复杂度。
于是就做到了 。
当然还有一些简单的小技巧。
比如 CF273E、CF1312F 这种,观察到后继状态少得离谱时可以(打表)找循环节。
转化到经典问题
CF1498F Christmas Game
容易看出,每个棋子的行动轨迹是固定的,于是可以联想到阶梯 。 的情形与阶梯 是等价的吗?多个子树会不会影响这个问题?
考虑阶梯 (向左移动,从 标号):在奇数位置的数是没用的,把多少移到偶数位置就可以又把它们重新移到奇数位置。所以相当于对偶数位置玩 。
而在本题呢?设根节点深度为 ,当 时,不难发现子树合并这种问题是完全没事的:如果合并偶数,相当于丢掉,而移动到奇数,就可以再次把它移到偶数。所以这也是在对深度为奇数的点玩 。
的情况,把深度设为 即可。
以每个点为根,自然就是换根喽。先以 为根,设 表示假设节点 的深度模 余 ,子树里深度为奇数的节点权值的异或和就可以换根啦!
CF142D Help Shrek and Donkey 2
首先判掉存在一行只有 个棋子的情况。然后发现就是 模板了。因为若朝远离对方棋子的方向移动,则对方可以同样移动来保证棋子间距不变,所以只能靠近对方棋子,就相当于一个关于间距的 了。
HDU3595 GG and MM
考虑 的情况。令 。 若 ,说明操作方案唯一, 可以直接转移;否则 ,此时先手可以考虑把 变成 或 ,这两种状态的 不同,所以其中一定有一种是必败态,所以此时先手必胜。
顺便维护一下 即可。
没那么套路的题
其实是还没更完。。。
CF930D Game with Tokens
题意:有一个无限大的棋盘,上面有一些黑棋。你需要放一个白棋,接着进行若干回合如下游戏:
-
白棋向上下左右任意一个方向移动一格。如果移动到了与某个黑旗同样的位置,黑方胜。
-
所有黑棋 分别独立 地向上下左右任意一个方向移动一格。这期间黑棋可以重叠,且若某个黑棋与白棋处于同一位置,游戏继续。
如果黑棋不能在有限个回合内获胜,则白方胜。
求有多少个坐标,使得在该坐标放下白棋能使黑方胜(保证双方足够聪明)。
做法:
考虑黑棋要怎么包围白棋。
如图,这样的一个黑棋能使它上下左右的这些位置的白棋只能朝相对于黑棋的方向(下上右左)移动有限步。
方法是:如果白棋向黑棋走,那么黑棋向白棋方向逼近一格,否则与白棋朝同一个方向移动。
然后又要转 ……一个黑棋的限制变成四个 矩形。现在就要求有多少个点同时在四种方向的 矩形的交里。
这个只要按横坐标排个序,维护一下前缀最靠上的“右下矩形”和最靠下的“右上矩形”,后缀前缀最靠上的“左下矩形”和最靠下的“左上矩形”即可。
CF1221E Game With String
这个 就很魔性。找性质吧。。。
- 存在一个长度为 的区间,先手必败。
因为后手可以留一手!
- 若先手无论如何操作,总会有长度 的区间,先手必败。
后手可以操作出一个长度恰好为 的。
那么如果存在大于一个“长度 的区间”,说明先手输了。
否则若不存在“长度 的区间”,就看长度 的区间的奇偶性。
若存在 个,就看先手能操作出什么。
当然以上情况默认了 ,如果 的话判断更简单,略。
CF1368F Lamps on a Circle
最终答案应该是,选择一个 ,然后 个亮, 个不亮这样,最后会有一小段连续的不亮段。然后对面灭掉 个。
此时的收益为
求个导。
我不会这个向下取整啊。算了,设 ,那么 。这玩意在 时等于 ,所以原题的 取 和 试一下取最大值即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)