『博弈』做题记录

AGC002E

题意:两人轮流操作, \(n\) 堆石子,每次操作可取走最大的那一堆,或全部取 \(1\)

考虑将原序列排序,然后考虑把序列看成一个矩阵,第 \(i\) 列有 \(a_i\) 个矩阵元素。

两人操作可看成从 \((0,0)\) 开始走,每次向左或右走一步。

然后这就是一个简单博弈了。

CF494E

题意:有一个 \(n \times n\) 的矩阵,初始有些子矩阵为白,其余为黑,两人博弈,每次操作即为选择长不超过 \(k\) 的子矩阵反色,求 sg。

考虑分割小游戏。

将一个点单独为白时(其余为黑)看成一个游戏,求这个点的 sg ,然后不难证明 这些白点 sg 异或和即为整个游戏 sg。

考虑怎么求点 sg,有个显然的事实是: \(sg(x,y)= \text{mex}_{1 \leq i,j \leq k} {\bigoplus\limits_{i=x-i}^{x}\bigoplus\limits_{j=y-i}^{y}[i \not=x \| j \not=y] sg(i,j)}\)

然而复杂度吃不消,然后你就开始打表,结合数学归纳法和题解,我们可以得到结论 \(sg(x,y)=\min(\text{lowbit}(x),\text{lowbit}(y),\text{greatbit}(k))\) 然后上个扫描线,复杂度就将为 \(O(m \log n)\)

upd:这个具体证明我有时间补一下,我当时好像拿这个讲题讲了具体证明。

CF1451F

题意:给定矩阵,每次操作取矩阵上最短路,保证任意时刻数 \(\geq 0\) 减小起点,路径上点随便改,两人博弈,求 sg。

考虑将右上左下斜数看成一个子游戏,总游戏先手必胜时有子游戏异或和不全为 \(0\) 。 证明:显然有从一个不为 \(0\) 的斜线开始,这个子游戏显然可以当成普通 nim,然后后面即使有起点位置限制,但随便改将限制淡化,可使全部子游戏全部异或和为 \(0\)

推荐类似练手题:CF1149E

P5363

题意: 在 长为 \(n\) 链上放 \(m\) 个棋子,两人博弈,每次可将任意棋子向左移任意步,不可越过棋子,求先手必胜状态个数。

考虑转化游戏,将原游戏的两个棋子相距当成一堆石子,然后操作变成了将一堆石子给 \(k\) 个给右边一堆。 这显然是个阶梯 nim ,阶梯 nim 有个显然结论: 奇数阶梯石子数异或和非 \(0\) 时,先手必胜。

发现题目转化后是偶数堆石子数异或和非 \(0\) 时,先手必胜。

我们考虑 sg 上 dp,发现非 \(0\) 不好记录,考虑容斥掉,记录为 \(0\) 答案。

CF1110G

题意:给定树,先手可以在树上某个节点染白色,后手可以在树上某个节点染黑色,出现链长为3的相同颜色时,涂该颜色的人获胜。判断谁赢或平局(染色不能覆盖已染色的节点)。

首先,后手必不胜。其次,存在度数大于 \(4\) 的点,先手必胜。

如果所有点度数都小于 \(3\) ,显然平局。 对于接下来的情况,讨论某个或某对度数为 \(3\)

不难证明,对于一个度数为 \(3\) 的节点,只要存在两个或以上子节点满足度数大于 \(1\) ,先手必胜。

对于一对度数为 \(3\) 的节点,他们之间的距离为偶数时,先手必胜。 以上所有情况均可 \(O(n)\) 解决。

CF388C

题意:两人博弈,有 \(n\) 堆牌,\(\text{Alice}\) 每轮可以从牌堆顶取一张,\(\text{Bob}\) 每轮可以从牌堆底取一张,两人都希望自己取的牌点数和最大,问两人最终点数和分别是多少。

贪心。 两人必然分别会取走每堆牌顶和底 \(\lfloor \frac{a}{2} \rfloor\) 个,然后考虑奇偶问题,考虑将所有堆中间的那个点数放进堆中,然后两人顺序取点即可。

AGC010F

题意:树,点有点权,一棋子于根,两人每轮可以走一步,然后将当前位置点权值减一,不可走负点或 \(0\) ,无法移动的输,求谁必胜。 不难证明,对于所有情况,一定是往叶子节点走,然后就很好处理了。

P2490

忘了不写。

P6665

摆烂人,忘了,但是大概是 01trie 优化 sg 函数。

P8347

考虑子树不全是都是 \(\text{P}\) 态时显然是 \(\text{N}\) 态,那对于全是 \(\text{P}\) 态时,就是转化为双方只能删树。 那就是 AGC017D 的典题,但是有点问题,这是无法操作者赢的游戏,那就求出 sg 然后转化为 anti-sg 即可。

P7979

这种题,拿到题第一眼一定先打表。

首先这是显然的 knim,设 \(\text{SG}(x)\) 为石子数为 \(x\) 时的 \(sg\) 值,考虑什么局面可以被转移。

\(a=(e+d \sqrt{s}),b=(e-d \sqrt{s})\),其中 \(s \in \mathbb{N}\)\(x,d\) 都是整数或分数。

而又要满足 \(2e \in \mathbb{Z} ,ab =x,2e \leq x\)

\(\therefore e= \dfrac{g}{2}\leq x,e^2-d^2s = x \ \ (g \in \mathbb{Z})\)

不难发现 \(e^2-d^2s = x\) 等价于 \(e^2 \geq x\)

\((2e)^2 \geq 4x,2e \in \mathbb{Z}\),即 \(g \geq \lceil 2\sqrt{x} \rceil\)

那么有 \(\text{SG}(x)= \text{mex}_{i=0}^{x-\lceil 2\sqrt{x} \rceil} \{ \text{SG}(i) \}\)

经过打表或者瞪眼都不难发现,\(sg\) 函数单调不降。

那么这提示我们求 \(sg\) 值的时候可以二分,那我们需要求 \(dsg\) 值。

\(\text{DSG}(x)=\min\{j|\text{SG}(j)=x \}\)

考虑怎么转移:

\(\text{DSG}(x+1)=\min\{p| p-\lceil 2\sqrt{p} \rceil \geq \text{DSG}(x)\}\)

\(q=\text{DSG}(x)\)

式子重构一下:

\(p-\lceil 2\sqrt{p} \rceil \geq q\)

\(\Rightarrow p- 2\sqrt{p} \geq q\)

\(\Rightarrow 2\sqrt{p} \leq p-q\)

\(\Rightarrow 4p \leq (p-q)^2\)

\(\Rightarrow p^2-(2q+4)p+q^2 \geq 0\)

不难发现求出 \(\geq q\) 的最小根即为所求。

不难发现根为 \(\dfrac{(2q+4)\pm \sqrt{(2q+4)^2-4q^2}}{2}=q+2\pm \sqrt{4q+4}\)

显然,只有在取正时才 \(\geq q\)

\(\text{DSG}(x+1)=q+2+\lceil 2\sqrt{q+1}\rceil\),即 \(\text{DSG}(x+1)=\text{DSG}(x)+2+\lceil 2\sqrt{\text{DSG}(x)+1}\rceil\)

不难发现 \(sg\) 值是 \(O(\sqrt{S})\) 的。

那我们显然可以 \(O(\sqrt{S})\) 预处理一发,然后离线扫,不过这显然过不了。

然后开始震撼人心的打表环节。

\(\text{DSG}\) 差分 \(2\) 次,然后发现全是 \(2,3\)

然后对于 \(3\) 位置的数下表差分,然后扔到 oeis 上,就会发现他在形如 \(101010101\dots\) 的数上有值,当然也可以直接 \(O(\sqrt{S})\) 暴力找出所有 \(3\) 的位置。

预处理所有 \(3\) 位置的数,设第 \(i\) 个是 \(pos_i\),不难发现是 \(O(\log S)\) 的,

然后考虑将第一次差分得出的数写成 \(2k_i+d_i\) 的形式。

显然第 \(i\) 个数是 \(2(i+1)+\max \{j|pos_j \leq i \}\)

然后考虑再算出差分前的式子。

\(i\) 个数是 \(i(i+3)+\sum\limits_{j=1}^{i} \max \{k|pos_k \leq j \}\)

\(p=\max \{k|pos_k \leq i \},t_i=\sum\limits_{j=1}^{i}pos_j\)

考虑每个 \(pos\) 的贡献。

\(\Rightarrow i(i+3)+\sum\limits_{j=1}^{p} (i-pos_j)\)

\(\Rightarrow i(i+3)+ip -t_p\)

\(\text{DSG}(i)=i(i+3)+ip -t_p\)

不难发现对于每个 \(i\),有 \(pos_p \leq i < pos_{p+1}\)

\(\text{DSG}\) 显然单调不降,二分最大的 \(p\) 满足 \(pos_p(pos_p+3)+pos_p \times p -t_p \leq s\)

然后固定 \(p\) 后,解方程可得 \(i\) ,此处复杂度为 \(O(\log \log S)\)

但是拆二进制位则需要 \(O(n \log S)\) 的时间。

考虑在一个值域轴上,每个点有一个值,而算每个数二进制贡献,这样扫值域复杂度是值域乘一只 \(\log\)

考虑 \(\text{SG}\) 值是 \(O( \sqrt{S})\) 的,发现由于二进制位是独立的,可以把分位放到值域轴上扫。

假设分了 \(w\) 段,此处复杂度就是 \(O(w(S^{\frac{1}{2w}}\log S+n))\)

总复杂度就是 \(O(n \log \log S+w(S^{\frac{1}{2w}} \log S+n))\)

hdu 2509 hdu 3032 pku 2311 pku 3537 bzoj 2940 bzoj 1188 bzoj 3576 hdu 3595 pku 3710 hdu 2509

posted @ 2022-07-08 16:16  Detect-Perplexity  阅读(24)  评论(0编辑  收藏  举报