SG函数 博弈笔记
基础知识
公平组合游戏
公平组合游戏指的是:
-
一个人可以做出的决策与这个人是 Alice 还是 Bob 无关,只和当前游戏状态有关。
-
大家都知道游戏的完整信息,知道现在的状态,云云。
-
不能多次到达同一个状态。
-
无论怎么操作,游戏必须在有限步操作后结束,且必须有胜负,不能平局。(当然好像有些题目违反了这一条,却还是可做,让我上蹿下跳)
注意,象棋不是公平组合游戏,因为玩家不能用对方的棋子,而且也可以通过来回走棋子使得游戏永不结束。
SG 函数
对于一个 SG 图:
-
没有出边的点,是必败点。
-
所有出边都是必胜点的点,是必败点。
-
有至少一个出边是必败点的点,是必胜点。
证明显然,故不证明。
对于一个点 \(SG(x)=\text{mex}(\ SG(v)\ )\)。
所以初始状态是,没有出边的点 \(SG(x)=0\)。
对于 \(n\) 个游戏,两个(如贝极星般)顶级聪明玩家博弈,每次可以选择一个游戏操作一次,最后所有游戏都不可以操作的玩家失败。
设 \(n\) 个游戏的起点分别为 \(s_1,s_2,...,s_n\)。
先手必胜当且仅当:
所以等于 0 就先手必败了。
同时, \(T\) 也被称作整局游戏的 SG 值。和一个点不同的是,它是由若干个棋子(几个独立的游戏),而一个点只有一个棋子。
最后落得满盘皆输,却不晓得,从最初之始,就已是命中注定!
例题
不要问为什么题目顺序如此奇怪
P3185 - 分裂游戏
https://www.luogu.com.cn/problem/P3185
发现,如果一个瓶子有大于等于两颗豆子,那么后手可以模仿先手操作。
所以只关心一个瓶子豆子模 2 的数量。
计算 SG:
\(SG(n)=0\),因为 \(n\) 上的豆子不能移动。
\(SG(i)=mex (\ SG(j)\ xor\ SG(k)\ ),i<j\le k\),因为将 \(i\) 移动到 \(j,k\) 后,就相当于两个独立的游戏 ,独立游戏的 SG 值就是它们的异或,然后再取 mex。
所以,最后答案就是,如果瓶子 \(i\) 的豆子模 2 等于 1,那么就 \(SG(ans)=SG(ans)\ xor\ SG(i)\)。因为是独立游戏。
Nim 游戏
每堆石头是独立的,所以答案是它们 \(SG\) 值的异或和。
0 个石头:\(SG(0)=0\)。
1 个石头:连向 0 石头状态,所以 \(SG(1)=mex(\ SG(0)\ )=1\)。
2 个石头:连向 0 石头和 1 石头状态,所以 \(SG(2)=mex(\ SG(0),SG(1)\ )=2\)。
……
\(n\) 个石头:连向 \(0,1,2,...,n-1\) 石头状态,所以 \(SG(n)=n\)。
所以如果 \(xor (\ SG(a_i)\ )\ne 0\) 则先手胜,否则先手败。
AGC017D - Game on Tree
https://www.luogu.com.cn/problem/AT2667
对于一个以 \(x\) 为根的树,如果 \(x\) 只有一个儿子(不是只有一个子孙),那么先手斩断这条边就可以赢。
如果有两个儿子,那么谁先断掉某一条边,谁就输,所以就转化到在两子树上分别博弈。
但是,不论在子树中如何切割,我都可以直接将根到儿子的边直接切断,结束在子树中的博弈,所以子树中所有的博弈状态都会直接连到砍掉子树的状态。
所以就是 Nim 游戏了。对于一个点 \(u\) 且它的儿子是 \(v_1,v_2...\),那么 \(u\) 对应的 SG 值(此时状态就是只保留 \(u\) 所在的子树,的博弈状态),\(SG(u)=xor(\ SG(v)+1\ )\)。(因为 \(0~SG(u)-1\) 的所有值都被占用了,感性理解一下)。