P10398 题解
blog。博弈论。
考虑使用 AGC002E 的方法分析:将 \(a_i\) 升序排列,然后画成下图状物。
一次操作相当于消掉最下面的一行 / 最左边的一列,消完的人胜利。
将这个问题转换为:你在左下角,每次可以往上面(上面是空的就走到右上)/ 右边走一步,谁先走到最后一列就赢了。
于是可以写出 \(O(\sum a_i)\) 的弱智 DP,答案即 \(dp_{1,1}\)。获得 \(23\) 分的高分。
下文令 \((a,b)\) 表示到达第 \(a\) 堆石子第 \(b\) 行的位置。
打表有一些观察:\((a,\text{#})\) 处,除去最顶上的位置,其余位置胜负态交替。出现这个的原因是「上面是空的就走到右上」,所以可能需要特判边界。
正解就是模拟这个 DP。考虑 \((2,1)\),由于 \(a_i\) 互不相同,故 \(a_2\ge2\),\((2,1)\) 不会受到边界情况牵制。于是 \((2,1)\) 为胜利当且仅当 \(n=1\) 或 \(a_{n-1}\equiv n\pmod 2\)。
若 \((2,1)\) 输了,此时:
- 若 \(a_1\ge2\),此时考虑 \((1,2)\) 位。注意到此时 \(a_2\ge3\),结合 \((2,1)\) 输了,则 \((1,2)\) 必胜,进而 \((1,1)\) 位的两个决策都会使对手进入必胜态,于是此时直接输出
Bob
。 - 否则 \(a_1=1\),此时考虑 \((2,2)\) 位:也就是把下面一行删掉,进而成为了一个大小为 \((n-1)\) 的子问题,这个子问题的答案与原问题的答案相反。
想清楚后,这个「分治」的过程也可以用循环简单 \(O(n)\) 实现。