每个 L 形都会取走某一列的两个格子以及相邻列的一个格子。因此每一步都会产生空列,将左右两侧分成互不影响的独立游戏。
在空列分隔出的每个区间中,只有两端的列可能仅剩一个格子,内部各列始终剩下两个格子。任何操作之后,这个性质仍然成立。
设区间内剩余格子数为 。每一步都会留下大小为 和 的两个区间。反过来,每个 的划分都能实现:按列从左到右排列剩余格子,任意连续三个格子都由某列的两个格子与相邻列的一个格子组成,因此取走前 个格子之后的三个格子即可。其他朝向不会产生额外的大小组合。
所以区间的 SG 值只取决于格子数,记为 。有
且当 时,
其中 是集合中未出现的最小非负整数, 表示按位异或。
初始时只有一个包含 个格子的区间。若 ,输出 YES,否则输出 NO。
令 为输入中最大的 。预处理到 需要 时间和 空间,此后每个测试用例只需 时间。总时间复杂度为 ,包含输入的空间复杂度为 。
子任务 1 满足 。用位掩码表示 个格子的状态,枚举所有合法 L 形并进行记忆化搜索。缓存每个不同 的答案后,对于 ,时间为 ,空间不超过 。子任务 2 使用上述 SG 递推。
Solution written by GPT