1 条题解
-
0
一、问题重述
给定两个极大数组 (长度 )与 (长度 ),数组元素取值在 之间。 Alice 与 Bob 轮流进行如下操作: 向初始为空的序列 末尾追加一个数字,使得 始终是 与 的公共子序列。 无法操作者负,Alice 先手。
共 次询问,每次给出 :
- 切掉 前 个元素,切掉 前 个元素;
- 在剩余的子数组上进行游戏;
- 题目保证剩余部分开头元素相同。
求每次询问中 Alice 是否有必胜策略。
限制: ,,。 数组以连续等值段形式给出: 有 段, 有 段,相邻段值不同。
二、游戏本质分析
因为 必须是 的公共子序列,且只能向后追加,所以:
- 每一步只能选择当前位置之后、在两数组中都存在的下一个公共颜色;
- 合法移动唯一确定:只能沿着相同颜色依次向后走。
这是一个无分支的公平博弈,胜负只取决于最大可操作步数的奇偶性。
三、形式化定义
1. 段结构
设:
- 表示 的第 段,值为 ;
- 表示 的第 段,值为 。
对于询问 ,可以在 / 内定位到:
- 落在 的第 段;
- 落在 的第 段。
题目保证 。
2. 后继状态
对当前段对 ,令颜色 。 定义:
- : 中第 段之后第一个值为 的段编号;
- : 中第 段之后第一个值为 的段编号。
若不存在这样的段,则 或 。
3. 胜负状态(Grundy 数)
定义 :
- :当前先手必胜(Alice 赢);
- :当前先手必败(Bob 赢)。
转移规则:
$$dp[i][j] = \begin{cases} 1 & nx(i) > n\ \text{或}\ ny(j) > m \\ 1 - dp[nx(i)][ny(j)] & \text{其他情况} \end{cases} $$直观解释:
- 无法再走时,当前玩家胜;
- 每多走一步,胜负状态翻转一次;
- 最终等价于判断最大可走步数是否为奇数。
四、算法结构
-
预处理连续段前缀和 用于快速将位置 映射到对应段编号 。
-
预处理后继段 对每个段 ,求 ;对每个段 ,求 。
-
区间 DP 打表 按段编号从后往前递推,填充 。 复杂度 ,在 时为 ,完全可接受。
-
处理大量询问 对每组 :
- 定位段 ;
- 若 输出 Yes,否则 No。 单次查询 或 ,可支持 。
五、正确性证明
- 公共子序列的扩展路径唯一:只能沿相同颜色顺序前进。
- 游戏无分支、无选择,是一条链。
- 链上每一步翻转胜负,因此状态只由后继状态取反得到。
- 无法扩展时当前玩家获胜,对应边界 。
- 所有询问满足起点颜色相同,因此状态合法有效。
六、复杂度总结
- 预处理:
- DP 计算:
- 单组询问:
- 总复杂度: 可在 内通过全部数据。
七、结论
- 若从段对 出发的最长可操作步数为奇数,则 Alice 必胜;
- 若为偶数,则 Bob 必胜;
- 用 记录奇偶结果,查询时直接查表即可。
- 1
信息
- ID
- 6370
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者