博弈论
SG函数
有向图游戏及SG函数
每一个公平 ICG 游戏显然都对应一个有向图,把每个节点看成游戏的每个状态,连边代表进入下一个状态。于是有,
有向图游戏必败,当且仅当目前局面 \(\mathrm{SG}>0\)。反之则为必败。
打表的时候 \(\mathrm{SG}\) 的集合并可以用 bitset 来快速操作,取 \(\mathrm{mex}\) 就直接扫描即可。
有向图游戏的和
有 \(m\) 个有向图,每次可以在其中一个图上操作一次。
总的 \(\mathrm{SG}\) 值为各个子游戏 \(\mathrm{SG}\) 函数值的异或。证明方法类似 NIM 博弈。
如果是每次可以在任意多 \((>0)\) 个游戏上操作的话就是 \(\mathrm{SG}\) 函数的或。
同样,我们也可以知道其实 NIM 游戏中每一个单独的堆中的 \(\mathrm{SG}\) 函数就是堆中石子个数。数学归纳法可证,首先 \(\mathrm{SG}(0)=0\),\(k\) 节点下面有 \(k\) 个节点,\([0,k-1]\),每一个节点的 \(\mathrm{SG}\) 值都等于石子个数,取一下 \(\mathrm{mex}\),\(\mathrm{SG}(k)=k\)。
什么时候拆成多个有向图?就是我们发现博弈中的每一个状态形如 \((s_1,s_2,s_3...)\) 由多个状态构成就可以拆。然后直接异或即可。
题目
AGC017D Game on Tree
一个状态可以表示为 \((s_1,s_2,s_3....)\) 每个 \(s\) 表示 \(u\) 的一个子树,多状态所以这是多个有向图。所以 \(u\) 的 \(\mathrm{SG}\) 是所有子节点 \(\mathrm{SG}\) 的异或吗?其实不是,因为 \(v\) 到 \(u\) 还有一条边,所以其实是子节点的 \(\mathrm{SG}\) 函数值加一再全部异或起来。可以类比 NIM 博弈。\(+1\) 的根本原因是这个是关于边的 NIM 而不是关于点的 NIM。
P2148 [SDOI2009] E&D
如果可以算出一组石子的 \(\mathrm{SG}\) 函数,那么把他们异或起来显然就是正确答案。
可是这个 \(\mathrm{SG}\) 函数似乎不太好直接看出来。于是我们直接打表观察规律。
打表之后很明显的对于二元组 \((a,b)\),若两者都是奇数,其 \(\mathrm{SG}\) 值为 \(0\)。这提示我们对于奇偶分类,如果两者都是偶数的话就有 \(\mathrm{SG(a,b)}=\mathrm{SG}(\frac{a}{2},\frac{b}{2})+1\)。如果 \(a\) 偶 \(b\) 奇的话,可以通过 \(\mathrm{SG}(a,b)=\mathrm{SG}(a,b+1)\) 来转化到两偶的情况,这样子可以用 $\log $ 的复杂度单点计算。
还有一种方法就是观察相同数字法,可以分治来解决。
AT_ttpc2019_d 素数取りゲーム
列出 \(\mathrm{SG}\) 函数的转移式子
首先有 \(SG(0)=0,SG(2)=1\)。
可以发现 \(x-2 \notin P\) 的时候,\(SG(x)=1\)。
否则就是 \(\mathrm{SG}(x)=\mathrm{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\) 即可,数学归纳法可证。
NIM 变型
NIM游戏 改成取完者输。
设异或和不为 \(0\) 是 \(S\) 态,异或和为 \(0\) 是 \(T\)。
按照 \(1\) 堆的个数分为 \(S_0,S_1,S_2\),分别表示全都是 \(1\) 堆,有 \(1\) 个非 \(1\) 堆,有多个非 \(1\) 堆。对于 \(T\) 同理分类,但是注意其实 \(T_1\) 是不可能存在的,因为若干个 \(1\) 和一个大于 \(1\) 的数不可能异或和为 \(0\)。
首先 \(T_0\) 必胜,\(S_0\) 必败。
其次,\(S_1\) 必胜因为可以选择将唯一一个非 \(1\) 堆拿完或者只剩一个,这样子其中肯定有一种方式转化为 \(S_0\)。
遇到 \(S_2\) 的时候,我们的策略就是一直转化为 \(T\) 态就赢了,因为 \(S_2\) 只能到 \(T_2\) 态(\(T_1\) 不存在且 \(2\) 态不可能直接到 \(0\) 态)。而对面得到的 \(T_2\) 态只能到 \(S_1\) 和 \(S_2\),如果对面选择 \(S_1\) 我们就赢了,否则我们每次拿到 \(S_2\) 就转化为 \(T_2\),若干次之后石子被消耗了对面就只能选择 \(S_1\) 态了,我们就赢了。
因此必胜态为 \(T_0,S_1,S_2\),必败态为 \(S_0,T_2\)。
斐波那契博弈
有一堆石子,第一次取的时候可以取走若干个(但不能取完)。之后每次至少为 \(1\) 个,至多为之前的 \(2\) 倍。取完最后一个的人胜。
当且仅当初始为斐波那契数的时候先手必败。
巴什博弈
每次取的石子个数在 \([1,m]\)。
当 \((m+1)\mid n\) 的时候,先手必败。
威佐夫博弈
有两堆物品,每次从任一一堆中选取至少一个,或者从两堆中取同样多的物品,取光者胜。
设两堆为 \(x,y\),满足 \(x>y\),当 \(y=\lfloor\frac{\sqrt 5+1}{2}(x-y)\rfloor\) 的时候,先手必败。
直接算可能会被卡精度,考虑转化为上述式子在 \([b,b+1)\) 范围内,然后两边平方得解。
NIM阶梯
只需要考虑奇数堆即可。异或起来按照普通 NIM 做。
P3480 [POI 2009] KAM-Pebbles
差分之后直接就是阶梯博弈了
经典题目
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)\)。
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 值即可。
P3185 [HNOI2007] 分裂游戏
同样是复杂状态 SG 函数题。可以发现状态是 \((c_1,c_2...c_n)\),每个状态的后继是 \((c_1,..,c_i-1,..c_j+1,..,c_k+1..c_n)\),可以这么做的话状态数太大了。思考如果简化状态来 SG,有一个很重要的观察其实每个糖果是独立的,并且如果只是添加一个的话可以看成一堆 \(n-i\) 个石子,但是本题是添加两个。
原本单个的 SG 值就是 \(n-i\),然后异或起来即可。那么现在枚举所有转移,\(O(n^3)\) 可以计算所有单点的 SG 值然后异或起来即可。
AGC016F Games on DAG
首先,这两个石子可以看成两个独立游戏。于是根据 SG 函数的结论就是当 \(\mathrm{SG}(1)\oplus \mathrm{SG}(2)=0\) 的时候,先手必败。于是我们只要求出 \(1\) 和 \(2\) 函数值相同的方案数,然后拿总方案减去即可。
在这题中学到了 DAG 上 \(\mathrm{SG}\) 值的刻画,就是我们考虑按照 \(\mathrm{SG}\) 值将这个图一层层剥开。
我们设 \(\mathrm{SG}\) 值为 \(i\) 的点的集合为 \(S_i\)。对于初始的 \(S_0\),我们要求其没有出边,且是一个独立集。假设已经确定了 \(S_0,S_1...S_{i-1}\),新加入 \(S_i\),我们要求其中每个点都和 \(S_0,S_1...S_{i-1}\) 有连边,并且其是一个独立集。
这就提供了一个很好的拆分图的方式,我们只需要 \(1\) 和 \(2\) 在同一个 \(S_i\) 中被加入即可。
设 \(dp_{i,s}\) 表示已经加入了 \(\mathrm{SG}\) 值为 \([0,i]\) 之内的集合,其并集为 \(s\),同时要求 \(1,2\) 要么没加入,要么在上述的同一个集合内的方案数。
在加入点的时候,统计边是否要连上的方案数即可。
时间复杂度 \(O(n3^n)\)。
XYD3618 a
先观察 W.B 的情况,可以发现两边都不能往中间地带走了。只能把后面的兵不断往中间靠近。如果一方不能继续挪动后面的兵就只能一个一个将子送给对面。所以可以看出一般情况的策略就是不断抢占中间地带,直到双方只隔着一个格子就碰上了,此时再挪动后面的位置。对于一般情况是很好在直接计算可移动步数来快速求解的。
但是还有一个特殊情况,就是当初局面直接就是 WB 这种直接相交的情况。如果是 WB.,那么 W 直接吃掉 B 是优的。如果是 WBB,当 W 吃掉 B,第二个 B 必然会再吃掉 W,这个时候转化为一般情况处理,如果这种决策会导致 W 输,那么 W 可以选择不吃,这个时候给 B 同理决策一下。
XYD10170.Tspin single
首先答案具有单调性可以二分答案。
判定的时候考虑根据阈值转化为 \(01\) 序列。然后看看 Alice 能否将其留住 \(0\)。
直接贪心去取显然是很难做的。于是我们去考虑什么时候 Alice 能取完 \(1\)/不能取完 \(1\)。有一个充分条件就是假设 Alice 可以操作 \(t\) 次(且最后一次是 Bob 操作),那么我们需要划分出 \(t\) 个长度 \(\le k\) 的区间,满足其中 \(1\) 的个数 \(\le k-1\) 且覆盖了所有 \(1\)。猜测这个条件是充要的,也就是 Bob 可以有足够好的策略使得每次不会减少 Alice 需要选的区间个数。
严谨证明我不太会,可以自己构造几个自己觉得极端的样例然后研究一下,还是比较能接受的结论。010100101 这个局面遇到了 \(k=3\),此时显然是 Alice 需要 \(2\) 次,但是 Bob 很难不做到不取原本覆盖的 \(1\),不过观察到 101 这个局面两个 \(1\) 有距离,可以从前面拉一段前缀和这个 \(1\) 组合。这样子还剩一个 \(1\)。如果两个 \(1\) 靠近,那么我们可以从空缺出的一侧去拉一个段。
时间复杂度 \(O(n\log n)\)。
ABC261Ex Game on Graph
AGC056D Subset Sum Game
纳什均衡
双方博弈的时候,每个人要为自己的每种策略分配一个概率。什么情况能达到均衡呢?对于任意一个人 \(A\) 来说,求一个最大的 \(M\),使得 \(A\) 选择某种策略的时候,不管 \(B\) 选什么策略,\(A\) 的收益都 \(\ge M\),那么这个时候 \(A\) 的策略就是最优策略。
比如囚徒困境的纳什均衡就是两个人都招供。
NFLSP12569. 游戏
有 \(n\) 个房间每个房间里面有 \(a_i\) 个人在玩,你可以选择一间房间提醒它们,老师会选择一间房间打开去抓人,求两个人最优决策之下,老师期望抓到多少人?
设学生选择 \(i\) 的概率为 \(p_i\),老师选择 \(i\) 的概率为 \(q_i\)。那么 \(M=\sum q_i(1-p_i)a_i\),其中 \(\sum p_i=1,\sum q_i=1\)。
然后你会发现必须让 \((1-p_i)a_i\) 尽可能均匀,否则如果老师将更大的 \(q_i\) 压在更大的 \((1-p_i)a_i\) 上面的话,这个 \(M\) 就会变大。
所以理想情况就是所有 \((1-p_i)a_i\) 都相等,令 \(k=(1-p_i)a_i\),然后利用 \(\sum p_i=1\) 的条件,可以算出 \(k=\dfrac{n-1}{\sum\frac{1}{a_i}}\)。
这个时候 \(M=\sum q_ik=k\)。
写一发交上去发现只有 \(20\rm pts\)。
为什么呢?随便试几个数字,发现在 \(n=3\),\(a_i=1,20,4000\) 的时候答案居然 \(>1\),可是 \((1-p_i)a_i<a_i\),矛盾了!
其实是因为我们的 \(p_i\) 算出了负数,这个就是纳什均衡的 corner case,我们要舍弃负数解。
于是我们把 \(a_i<k\) 的 \(a_i\) 都删除继续计算答案,不断迭代直到满足所有 \(a_i>k\) 为止,这意味我们的 \(p_i\in[0,1]\) 符合条件!
迭代的过程可以用二分答案替代。
P9142 [THUPC 2023 初赛] 欺诈游戏
注意到题目里的这句话
你需要保证,在一方的策略不变的情况下,另一方无论如何改变自己的策略,都不能使自己的期望收益比原来多。
不妨从检察官的视角来看待这个问题(走私者同理)。
走私者放 \(i\) 元的收益显然与检察官猜某大小的概率有关。
设走私者放 \(i\) 元的收益为 \(E(i)\)。检察官猜 \(i\) 的概率为 \(p_i\)。
那么 \(E(i)=\sum\limits_{j=0}^{i-1}i\times p_j+\sum\limits_{j=i+1}^{n}p_j\times \dfrac{j}{2}\)。
如果我们的策略中满足 \(\{p_j\}\) 让某个 \(E_i\) 的比较大,那么如果走私者调整策略压到那个比较大的 \(E\) 上面就可以让自己收益期望变大,故不符合题目条件。
所以可以得出所有 \(E\) 都是相等的。
据此可以推出 \(p\) 的表达式,对于 \(q\) 同理。
QOJ10432. Fugitive Frenzy
先考虑双方的基本策略:
-
A:从当前节点选择一个叶子方向,一直走到那个叶子(毕竟 \(B\) 可以不断往里面缩,你不走到叶子肯定抓不到,所以必须走到底)。
-
B:以 \(A\) 走到叶子为一个回合,每个回合选择一个叶子一直待在里面直到回合结束。(\(B\) 在此期间的任何调整都可以证明不优于以上策略,因为调整的过程中可能被抓到,而且最终无论如何都要缩进一个叶子里)。
于是我们设一些未知数,\(f_u\) 表示起点为 \(u\) 的时候双方最优策略下期望多少轮会结束。\(p_{u,v}\) 表示 \(A\) 在 \(u\) 点的时候会选择哪个 \(v\) 点(叶子)向其进发。\(q_{u,v}\) 表示 \(A\) 从 \(u\) 点出发的时候 \(B\) 会选择哪个 \(v\) 躲在里面。
有了这些就可以列方程了,
由于 \(\sum\limits_{v} p_{u,v}=1\) 且 \(\sum\limits_{v} q_{u,v}=1\),总和一定,我们需要分配这些数。
- 提取 \(p_{u,v}\) 的系数 \(F_u(q_v)=dis(u,v)+f_v(1-q_{u,v})\)
我们希望所有的 \(F_u(q_v)\) 都相等,否则 \(p_{u,v}\) 不均等分配的时候如果大数对大数会产生一个很大的数,如果所有 \(q_v\) 都相等的情况下 \(p_{u,v}\) 必须平均分配,这样子总和就会均匀。
令 \(k=dis(u,v)+f_v(1-q_{u,v})\),再代入 \(\sum q_{u,v}=1\),可以得到 \(k=\dfrac{\sum \frac{d_v}{f_v}+cnt-1}{\sum \frac{1}{f_v}}\)。其中 \(cnt\) 是 \(v\) 的个数。再反带回 \(k=dis(u,v)+f_v(1-q_{u,v})\) 即可解出 \(q_{u,v}\) 的值。
- 提取 \(q_{u,v}\) 的系数 \(G_u(p_v)=-f_vp_{u,v}\)
这个不需要解方程也能看出来 \(p\) 就是权为 \(\dfrac{1}{f}\) 的加权平均数。
将以上全部代入之后可以得到 \(f_u=\dfrac{cnt-1+\sum\limits_{v\in{\rm leaf},v\neq u}\dfrac{d_v}{f_v}}{\sum\limits_{v\in{\rm leaf},v\neq u}\dfrac{1}{f_v}}\)。
这个形式难以高斯消元,可以考虑令 \(f_i=1\),然后直接迭代这个式子 \(1000\) 次即可。

浙公网安备 33010602011771号