博弈论

SG函数

有向图游戏及SG函数

每一个公平ICG游戏显然都对应一个有向图,把每个节点看成游戏的每个状态,连边代表进入下一个状态。
\(SG(u)=mex(\left\{SG(v_i) | v_i \in out_u\right\})\)
有向图游戏必败,当且仅当目前局面 SG \(>0\)。反之则为必败。

打表的时候 \(SG\) 的集合并可以用 bitset 来快速操作,取 mex 就直接扫描即可。

有向图游戏的和

\(m\) 个有向图,每次可以在其中一个图上操作一次。
总的 SG 值为各个子游戏 SG 函数值的异或。证明方法类似 NIM 博弈。
如果是每次可以在任意多(>0)个游戏上操作的话就是 SG 函数的或。
同样,我们也可以知道其实 NIM 游戏中每一个单独的堆中的 SG 函数就是堆中石子个数。数学归纳法可证,首先 \(SG(0)=0\)\(k\) 节点下面有 \(k\) 个节点,\([0,k-1]\),每一个节点的 SG 值都等于石子个数,取一下 mex,\(SG(k)=k\)
什么时候拆成多个有向图?就是我们发现博弈中的每一个状态形如 \((s_1,s_2,s_3...)\) 由多个状态构成就可以拆。然后直接异或即可。

题目

AGC017D Game on Tree

一个状态可以表示为 \((s_1,s_2,s_3....)\) 每个 \(s\) 表示 \(u\) 的一个子树,多状态所以这是多个有向图。所以 \(u\) 的 SG 是所有子节点 SG 的异或吗?其实不是,因为 \(v\)\(u\) 还有一条边,所以其实是子节点的 SG 函数值加一再全部异或起来。可以类比 NIM 博弈。\(+1\) 的根本原因是这个是关于边的 NIM 而不是关于点的 NIM。

P2148 [SDOI2009] E&D

如果可以算出一组石子的 SG 函数,那么把他们异或起来显然就是正确答案。
可是这个 SG 函数似乎不太好直接看出来。于是我们直接打表观察规律。

AT_ttpc2019_d 素数取りゲーム

列出 SG 函数的转移式子
\(SG(x)=\begin{cases} mex\{SG(0)\} & (x-2) \notin P \\ mex\{SG(0),SG(2),SG(x-2)\}& x-2 \in P \end{cases}\)
首先有 \(SG(0)=0,SG(2)=1\)
可以发现 \(x-2 \notin P\) 的时候,\(SG(x)=1\)
否则就是 \(SG(x)=mex\{0,1,SG(x-2)\}\),现在需要对于 \(x-4\) 讨论,我们可以发现连续三个公差为 \(2\) 的质数只有在 \(x=7\) 的时候才能满足(证明可以在 \(\bmod 6\) 的意义下讨论一下即可),于是只要特判 \(SG(7)=3\) 即可。其余 \(SG(x)=2\)

P6665 [清华集训2016] Alice 和 Bob 又在玩游戏

SG 函数不方便推出什么式子,所以我们考虑直接维护。

总的 SG 函数值等于各个树 SG 值的异或。

考虑求出一棵树的 SG 值,假设对于一棵树进行操作,我们要先选择一条链然后去掉,剩余的就是若干个子树,这次状态转移后的 SG 值就是这些子树的异或。对于所有断链方案的情况得出的 SG 值的集合并上断根节点得到的 SG,我们取 mex 就是这颗树的 SG 值了。

边界:独立点的 SG 值为 \(1\)

考虑如果快速维护断链统计过程,我们对于每个子树都维护一个 SG 值的集合,包含这颗子树所有断链(从根节点开始的链都可以写成:根节点+子树的一条链)的 SG 值。然后每次只需要向这个集合内异或其他子树 SG 值的异或和即可得到断这颗子树内链的,最后再合并到根节点(为了取 mex)。

经典模型

NIM博弈

\(n\) 堆物品,第 \(i\) 堆有 \(A_i\) 个,两名玩家轮流行动,每次可选某一堆中的任意多不为 \(0\) 个物品。取走最后一堆物品的人胜。

结论:先手获胜当且仅当 \(A_1\oplus A_2\oplus...A_n \neq 0\)
首先考虑 \(0~0~0~a\) 的情况,显然异或值不等于 \(0\),且先手必胜。每次先手就把当前的局面取成异或值为 \(0\) 即可,数学归纳法可证。

斐波那契博弈

经典题目

ARC122D XOR Game

最大/小化异或值,显然是从高到低位贪心考虑,而不是按照博弈顺序进行考虑。

其实 Bob 占据绝对主动的,也就是应该是 Bob 在游戏开始前就会想好,Alice 每次出哪个数,他就会拿哪个数来应对。

假设从高到低考虑到了第 \(z\) 位。思考什么时候这一位 Bob 可以做到 \(0\)。如果这一位有偶数个 \(1\),那么 Bob 是可以做到为 \(1\) 的,因为所有有 \(1\) 的数可以两两配对。如果有奇数个 \(1\),那么是可以做到为 \(1\) 的。

下面我们需要确定后面的位,对于第一种情况,如果 Alice 选 \(1\),那么 Bob 选 \(1\)。如果 Alice 选 \(0\),Bob 也应该跟着选 \(0\)。于是此时根据这一位是 \(0\) 还是 \(1\),分裂成两个集合,后续的操作只能在集合内部进行,对于两个结果应该取 \(\max\),因为 Alice 可以选择到 \(1\) 集合还是 \(0\) 集合。

对于第二种情况,Alice 的策略已经确定,就是选一个当前位带 \(1\) 的数,而且在所有一对数中也只有 Bob 选 \(0\) 才可能产生最终贡献,所以 Bob 要在 \(0\) 集合中选择一个数使得和 \(1\) 集合中的数异或的最小值最小,直接字典树即可。

时间复杂度 \(O(n\log n)\)

AGC056D Subset Sum Game

AGC002E Candy Piles

很巧妙的题目,博弈论题肯定是考虑状态和状态之间的转移。

状态是形如 \((a_1,a_2..a_n)\) 可以从 \((a_2,a_3..a_n)\)\((a_1-1,a_2-1..a_n-1)\) 转移而来。这样子看起来状态数太大了,肯定不能强行解。但是发现每次转移的时候状态的改变很小,每次的变动最多为 \(1\),所以总的状态数是 \(O(nV)\) 的。所以就有了暴力算法 \(O(nV)\)

进行优化,对于两个前驱状态的转移考虑放到网格图上思考。

考虑对于 \(a_i\) 降序排序然后画成柱状图,然后大概就是若干个顶点坐标为 \((i,a_i)\) 的矩阵组成。可以转化为从 \((1,1)\) 开始走网格。

发现全部都拿走一个就是往上走一步,拿走最多的就是往上走一步。如果谁从网格中走出去了就输了。

由于是只有两个相关状态的网格图所以 SG 值只有 \(0/1\)。找规律可以发现对角线上的 SG 值相同。

于是我们只需要找到 \(y=x\) 这条直线上最远的点看它的 SG 值即可。

posted @ 2024-02-21 16:50  Mirasycle  阅读(6)  评论(0编辑  收藏  举报