博弈相关做题笔记

P9387 [THUPC 2023 决赛] 巧克力

根据公式,对于单块长为 \(x\) 的巧克力,其 SG 函数 \(SG(x)=\mathrm{mex}_{a+b<x}(SG(a)\oplus SG(b))\)。又 \(SG(0)=0\)。令 \(a=0\) 可以得到 \(SG(x)\geq x\)。又 \(SG(a)\oplus SG(b)\le SG(a)+SG(b)\),故归纳可知 \(SG(x)=x\)

此时,小 I 需要初始状态 \(SG\) 值不为 \(0\),且操作一次后 \(SG=0\)。我们先求出初始状态的 \(SG=s\),剩余情况就是要选择一个长度为 \(x\) 的巧克力,分成长度为 \(a,b\) 的两个。由于巧克力几乎连续,我们可以认为前面部分是统计合法切分三元组 \((a,b,c)\) 使得 \(a+b+c\le n\) 的数量;后面部分可以用 \(\le m\) 减去 \(\le m-1\)。于是可以直接考虑第一个问题。

形式化地,我们需要 \(a\oplus c\oplus (a+b+c)=s\),且 \(b\ne 0\)。考虑从小往大枚举每一位 \(a,b,c\) 填的值,记录 \(f_{i,j,0/1,0/1}\) 表示考虑完第 \(i\) 位,往第 \(i+1\) 位进位 \(j\),前 \(i\) 位是否大于 \(n\) 的对应前 \(i\) 位,\(b\ne 0\) 是否成立的方案数,转移是朴素的。

P8382 [POI2004] Gra

阶梯 Nim:\(1\sim n\) 的位置上,每一个位置有若干个石子,每次可以选择一堆往前移动一个位置。结论是这等价于每一个奇数位置上的石堆拿出来做 Nim 游戏。原理可以理解成谁先动偶数位置上的式子,后手可以模仿操作,因此必败,所以双方都只会先动奇数位置的式子,将其移动到偶数位置上。

一个显然的必败态是 \(m-1\) 处有东西。不妨设 \(f_i\) 表示从小到大第 \(i\) 个格子的左侧的棋子连续段长度,也即最终的必败态是 \(f_{n-m}>0\)。再考虑一次移动,枚举移动后形成的较大的连续段长度 \(x\),移动终点是第 \(i\) 个空位,则 \(f_i\gets f_i-x\)\(f_{i+1}\gets f_{i+1}+x\),其中 \(0<x\le f_i\)

由于每个人都不希望自己操作结束后 \(f_{n-m}>0\),故所有操作均会在 \(f_{n-m-1}\) 处停止,也即首次把所有值全部移到 \(f_{n-m-1}\) 位置的人获胜。这是一个阶梯 Nim 模型,因此先手必败的条件是 \(f_{n-m}=0\)\(f_{n-m-2}\oplus f_{n-m-4}\oplus\dots =0\)

首先判掉 \(f_{n-m}>0\) 的情况,然后枚举每一个有值的 \(f\) 即可。求 \(f\) 可以直接枚举棋子,是容易的。

P8994 [北大集训 2021] 经典游戏

博弈部分是容易的。归纳可知一个点的 SG 值为其到子树内点的最大距离 \(dis_x\)。因此以 \(rt\) 为根时,整个局面的 SG 值为 \(\bigoplus [a_i\bmod 2=1]dis_i\)。要在任意加点的情况下都能必胜,也即需要 \(SG(rt)>dis_{rt}\)

下面是数据结构问题,需要支持的操作是单点给 \(a_i\) 加一和查询一个点的邻域中有多少个点满足上式。

先考虑修改。不妨考虑以修改的 \(x\) 为根,找出任意的一个最大距离子树和次大距离子树,则 \(a_x\gets a_x+1\) 后,最大距离子树内的点的 SG 会异或上次大距离;其它点会异或上最大距离。然后以 \(1\) 为根,不妨取出 dfs 序后用树状数组维护上述操作。

然后考虑邻域查询,一般考虑确定 \(1\) 为根,做祖先儿子分治。不难发现若此时最大距离子树是其儿子,则一定是长剖后的重儿子,且每个轻儿子的 \(dis_{rt}\) 相同,均为父亲的最大距离 \(+1\) 。因此不妨考虑查询时单独查询自己、父亲、重儿子是否合法,使用结构同时维护轻儿子的情况。由于全局异或一个值、查询大于一个值的个数是不好做的,注意到所有轻儿子被异或到的值几乎就是父亲被异或到的值,因此我们考虑直接在父亲处查询全局异或的 tag,操作变为查询轻子树内异或一个值后大于另一个值的数的数量,不妨使用 trie 进行维护。

再次考虑所有操作:长链剖分预处理出每个点的最大距离子树和次大距离子树,及它们是不是父亲。

  • 单点修改时,先在树状数组上进行相关操作。若最大距离子树在重儿子上,或修改点是父亲的重儿子,则所有轻儿子被异或到的值都与父亲相同;否则该点作为一个轻儿子,其与父亲及其它轻儿子的异或值不同,需要暴力删除后重新加入父亲的 Trie。
  • 查询时,暴力查询本身、父亲、重儿子的答案,轻儿子的答案可以统一在 Trie 上查询。

总复杂度 \(O((n+q)\log n)\)

P9631 [ICPC2020 Nanjing R] Just Another Game of Stones

Nim 游戏,先手必败当且仅当石子数异或和等于 \(0\)。考虑第二个操作,我们求出 \([l,r]\)\(x\) 的异或和 \(sum\),需要找有多少个石子堆 \(i\) 和减少到的石子数量 \(t\),满足 \(a_i\oplus t=sum\)。注意到 \(t<a_i\),也即需要统计 \(a_i\oplus sum<a_i\)\(i\) 的个数。不难发现这样的 \(i\) 满足其在 \(sum\) 的最高位上是 \(1\)

于是不妨使用线段树维护区间异或和以及区间中第 \(i\) 位是 \(1\) 的数的个数。修改使用吉司机线段树,维护区间最小值、区间次小值、最小值个数,以及一个 tag,表示要对这个区间中的最小值执行对值取 \(\max\) 的操作。每次递归到只有最小值需要操作的区间,操作并打 tag 即可。

[ABC278G] Generalized Subtraction Game

考虑 SG 函数。设 \(sg(i)\) 表示长度为长度为 \(i\) 的区间的 \(sg\) 值,注意到由于删除要求是一个区间,所以无法算出通项,只能 \(O(n^2)\) 地求每一个长度的 SG 值。根据 SG 值可以判定先后手以及每一次的操作,构造操作仍然是枚举每一个极长连续段(不妨用 set 维护),并枚举删去的区间,check 结果是否是先手必败。

这样做总复杂度是 \(O(n^3)\) 的。考虑一些其他更直接的策略:若存在一个删法,可以使得先手第一步删之后,左右两段相等,则接下来可以直接对称操作,必胜。显然 \(L\ne R\) 时一定存在这样的方式,于是只需要在 \(L=R\) 时执行上述操作,区间长度只有一种,故复杂度降至 \(O(n^2)\)

posted @ 2025-03-15 23:20  烟山嘉鸿  阅读(32)  评论(0)    收藏  举报