SG函数 博弈笔记

基础知识

公平组合游戏

公平组合游戏指的是:

  • 一个人可以做出的决策与这个人是 Alice 还是 Bob 无关,只和当前游戏状态有关。

  • 大家都知道游戏的完整信息,知道现在的状态,云云。

  • 不能多次到达同一个状态。

  • 无论怎么操作,游戏必须在有限步操作后结束,且必须有胜负,不能平局。(当然好像有些题目违反了这一条,却还是可做,让我上蹿下跳)

注意,象棋不是公平组合游戏,因为玩家不能用对方的棋子,而且也可以通过来回走棋子使得游戏永不结束。

SG 函数

对于一个 SG 图:

  • 没有出边的点,是必败点。

  • 所有出边都是必胜点的点,是必败点。

  • 有至少一个出边是必败点的点,是必胜点。

证明显然,故不证明。

对于一个点 \(SG(x)=\text{mex}(\ SG(v)\ )\)

所以初始状态是,没有出边的点 \(SG(x)=0\)

对于 \(n\) 个游戏,两个(如贝极星般)顶级聪明玩家博弈,每次可以选择一个游戏操作一次,最后所有游戏都不可以操作的玩家失败。

\(n\) 个游戏的起点分别为 \(s_1,s_2,...,s_n\)

先手必胜当且仅当:

\[T=s_1 \text{\ xor\ } s_2 \text{\ xor\ }...\text{\ xor\ } s_n\neq 0 \]

所以等于 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\) 的所有值都被占用了,感性理解一下)。

posted @ 2022-01-20 15:49  BlankAo  阅读(27)  评论(0编辑  收藏  举报