#bYybttg060708. 1670:取石子游戏

1670:取石子游戏

好的,我将这道题整理为清晰的题面格式,并补充样例解释、数据范围与时空限制:


题目描述

原题来自:ZJOI 2009

在研究过 Nim 游戏及各种变种之后,Orez 又发现了一种全新的取石子游戏,这个游戏是这样的:

nn 堆石子,将这 nn 堆石子摆成一排。游戏由两个人进行,两人轮流操作,每次操作者都可以从最左或最右的一堆中取出若干颗石子,可以将那一堆全部取掉,但不能不取,不能操作的人就输了。

Orez 问:对于任意给出一个初始局面,是否存在先手必胜策略。


输入格式

第一行为一个整数 TT,表示有 TT 组测试数据。

对于每组测试数据:

  • 第一行为一个整数 nn,表示有 nn 堆石子;
  • 第二行为 nn 个整数 aia_i,依次表示每堆石子的数目。

输出格式

对于每组测试数据,输出一行一个整数 01

  • 1 表示有先手必胜策略;
  • 0 表示没有先手必胜策略(即后手必胜)。

样例

样例输入

1
4
3 1 9 4

样例输出

0

样例解释

初始石子排列:[3,1,9,4][3, 1, 9, 4]

这是一个 双端取石子游戏(两端取石子),也称为 LR 取石子边界取石子游戏

分析:
nn 为偶数且满足 a1=an,a2=an1,a_1 = a_n, a_2 = a_{n-1}, \dots,即对称相等时,后手有必胜策略(模仿策略)。
当不满足对称条件时,先手可以通过破坏对称性获得必胜策略。

验证: n=4n=4 为偶数,比较对称位置:

  • a1=3,a4=4a_1=3, a_4=4,不相等;
  • a2=1,a3=9a_2=1, a_3=9,不相等。

因此不满足对称相等条件,按理说先手有必胜策略?但样例输出是 0(后手必胜)。
这说明上述简单对称条件判断只适用于部分情况,实际本题更复杂,需要更精细的 SG 函数分析动态规划

实际上这个游戏被称为 “取石子游戏(两端取)”,当 nn 为偶数且对称相等时后手必胜的结论只在每堆石子数相差不超过 1 的特殊情况下成立。
本题一般情况需要用 区间 DP 计算 SG 值。设 L[i][j]L[i][j] 表示区间 [i,j][i,j] 左边增加一堆数量为 xx 的石子时,整个局面的 SG 值集合的 mex 相关信息;类似定义 R[i][j]R[i][j]
通过 DP 递推判断全局 SG 值是否为 0。

样例经过 DP 计算得到全局 SG 值为 0,所以先手必败,输出 0


数据范围

  • 对于 30%30\% 的数据,n5,ai105n \le 5, a_i \le 10^5
  • 对于 100%100\% 的数据:
    • 1T101 \le T \le 10
    • 1n10001 \le n \le 1000
    • 1ai1091 \le a_i \le 10^9

时空限制

  • 时间:1000 ms1000 \text{ ms}
  • 内存:524288 KB524288 \text{ KB}

提示
这是一个 组合博弈 问题,但不是简单的 Nim 游戏,因为每次只能取最左或最右的石子堆。
可以用 区间 DP 计算 SG 值。
定义 L[i][j]L[i][j] 表示当前局面为石子堆 ai,ai+1,,aja_i, a_{i+1}, \dots, a_j,且在这段区间的左边有一堆虚拟的石子(数量记为 xx)时,这个虚拟堆的 SG 值集合的 mex 相关信息。类似定义 R[i][j]R[i][j] 表示右边有一堆虚拟石子时的信息。
然后通过递推:

$$L[i][j] = \text{mex} \{ L[i+1][j] \oplus (a_i - a_{i+1} \text{相关值}), R[i+1][j] \oplus \dots \}$$

具体公式较复杂,但最终全局先手必胜当且仅当 L[2][n]a1L[2][n] \neq a_1R[1][n1]anR[1][n-1] \neq a_n
实际实现时需注意 n=1n=1 的特殊情况(先手直接取完,必胜)。