历时 4 天补完这部分内容。

AGC002 E Candy Piles

打表,发现对角线上的 DP 值是一样的。

代码

PE306 Paper-strip Game

打表,有循环节。

代码

SPOJ COT3 - Combat on a tree

暴力求 SG 是的。把贡献累计一下可以优化到

我们考虑维护子树的策略集,然后向上合并。合并的时候需要做集合异或,合并,线段树(01TRIE)合并即可。复杂度

题解详见 Sshwy’s Blog 博奕论

代码

CF388 C Fox and Card Game

我们考虑先手的上界。如果后手模仿先手的行为,那么先手可以把每一堆前一半拿走,后手可以把后一半拿走。如果是奇数个数的堆那么中间会剩下一个,这个由谁拿走,我们不好说。但是下界是可以确定的,就是每一堆拿一半。

另一方面,如果先手可以通过某种方式拿到比一半还多的分,那么后手显然会模仿先手的行为来制止这种情况发生。

因此,每个人都会各拿一半。至于个数为奇数的堆,在拿完这一堆后,主动权会转移。因此先手显然会贪心地拿奇数堆中中间数最大的那个,然后后手拿第二大的,然后先手拿第三大的……

于是,我们每一堆各拿一半,把奇数中间的数拿出来排序,然后轮流分给先后手即可。

代码

CF494 E Sharti

根据翻硬币的套路,我们只需要求每个格子单独为白色时的 SG 值的异或和即可。那么打表可以发现:

于是,我们可以每次把除以 2,矩形的边界也除以 2 并向“内”取整。然后做次矩形面积并即可,根据需要来更新答案。

时间复杂度

代码

CF794 E Choosing Carrot

首先可以区间 DP,设表示区间,先手最大化,后手最小化,最终的值;表示先手最小化,后手最大化,最终的值:

打个表,发现对角线上的数相等,这样是可以做的。

更严谨地,我们证明当是偶数时整个序列的答案是。那么先手只需要根据需要选择一个拿走,然后模仿后手的行为即可。

是奇数的时候,我们相当于做一次 DP 转移,把的结果转移过来。

这样就证明了对角线相同的结论是对的。然后查询区间 max 即可。

时间复杂度

代码

AGC010 F Tree Game

我们把先手选择的第一个点做为根,那么我们可以证明对于结点

  1. 如果存在它的儿子结点满足是必败态,那么就是必胜态。证明很简单,如果后手想移到,你把它扔回即可。
  2. 其他情况,是必败态。并且当是叶子时也是必败态。我们可以理解为是先手把后手逼下来的,那么往上走是不优的。如果往下走到,有两种情况:是必胜态,或者。两种情况都是先手必败,因此得证。

时间复杂度

代码

CF1110 G Tree-Tac-Toe

首先考虑,把一个预先放有白点的结点变成一个人字结构:

game_therory_im1

变成

game_theory_im2

这样与原图是等价的。

考虑先手在 B 放一个白子,那么后手一定会在 D 放。留下的 E 和 F 不会改变先后手的顺序,因此等价。并且先手肯定在一开始就会在 B 放白子。因为不放白不放啊。不然被后手抢了 B,显然对先手不优。于是我们就证明了它与原图是等价的。

现在就变成了初始时没有白点的树结构。首先,如果存在一个 4 度以上的点,那么先手必胜:

game_theory_im3

另外,如果存在一个 3 度点,它的至少两个邻居都是非叶子结点,那么也先手必胜:

game_theory_im4

排除上述两种情况,可以发现这个图不可能有超过 2 个 3 度点。在这种情况下考虑一个骨头图:

game_theory_im5

这个骨头图可以理解为

game_theory_im6

这种状态显然是先手必胜。推广得到,如果骨头图中间的链长度为奇数,那么先手必胜。否则就是和局。

如果整个图只有一个 3 度点或者没有 3 度点,那么显然也是和局。

代码

ZR967 银

我们把整个游戏左右翻转,最左边是黑子的条件就变成了最右边是黑子。根据翻硬币的套路,我们只需要求每个棋子单独是黑色时的 SG 值就是答案。

打表发现,

那么我们再构造一个函数,表示把的每一位变成它的高位异或和。即。相当于把当成一个长度为 30 的数组,然后做后缀异或和。

不加证明地,有,且可逆(即构建了一个双射)。并且

那么有了这些结论,再来看题目。设当前局面的 SG 值是。相当于我们需要找到一个区间,满足位置上的是黑子,且

这个条件等价于

稍作化简就变成了

即对于一个固定的是唯一的(也可能不存在,因为我们要求)。思考发现,当且仅当的最高位在的二进制下也为 1 的时候,才存在合法的

因此我们的问题变成了:

  1. 插入一个数
  2. 删除一个数
  3. 询问第位为 1 的数的个数

数组维护即可。可以在插入删除的时候顺便维护。

时间复杂度

打表代码

代码

CF1033G

取模为什么是对的?首先,新游戏 G’的获胜策略在老游戏下也成立(加一个模仿)。而如果老游戏的获胜策略在新游戏失败,那么在老游戏中后手也可以让它失败。因此新老游戏等价。

我们强制,那么对于一堆

  1. :垃圾
  2. :Alice 胜利
  3. :一次性用品。
  4. :Alice 先手的大胜利;Bob 的一次性用品。

game_theory_im7

考虑只统计先后手获胜的方案数,因为 Alice 获胜与 Bob 获胜是对偶的。我们把上述决策树稍加整理,化简得到

game_theory_im8

我们要求不存在 2,设。那么或者。得到

我们要记录 3 的个数,即

存在 4:

考虑把从小到大排序。那么每次我们只需要统计时的获胜情况。

首先不存在 2。因此。这两个条件把所有是 2 的情况都 ban 掉了。

在满足上述两个条件后,容易发现都是垃圾,不用考虑。

由于 4 最多出现 1 次,观察 4 的判定条件,发现的条件已经满足了。因此满足的最多只有一个——由于最大,因此只有有选择权。

这样,相当于都满足。结合 3 的判定条件,发现它们都是 3。这样就可以根据的奇偶性判断当前是先手胜还是后手胜,然后进行统计。

对于是否选择 4,分情况讨论即可。在实现的时候也可不必,因为 3,4 的个数和都是奇数,可以直接统计到先手获胜的情况上。

代码