1 条题解
-
0
题意整理
- 有一棵 个节点的树,每个节点 上有 个棋子。
- 游戏规则:每次可将节点 的一个棋子移到它的子树内(不含 本身)的任意节点。不能动者输。
- 特殊能力:
- C:在游戏开始前,可以把根 换成一个相邻节点 。
- K:在游戏开始前,可以在任意一个节点加一个棋子。
- 每局游戏流程:
- 初始在节点 放一个棋子,根设为 。
- C 决定是否发动能力(换根到相邻节点,或不发动)。
- K 决定是否发动能力(在任意节点加一个棋子)。
- 进行正常游戏(C 先手)。
- 还原到步骤 1 结束的状态(即 上多一个棋子,其他 不变)。
- 问:C 在步骤 2 有多少种决策(换到哪个相邻根,或不换),使得 无论 K 在步骤 3 如何操作,C 都必胜。
关键分析
1. 基础博弈模型
这是一个多堆石子的变形,但移动限制在子树内(不含自己)。
实际上,这是一个有向图游戏:每个节点是一个子游戏,棋子在不同节点独立。
根据 SG 定理,整局游戏的 SG 值是每个有棋子节点的 SG 值的异或和。定义 表示以 为根的子树的 SG 值(考虑 上的棋子可以走到子树内其他节点)。
关键结论(经典树上 Green Hackenbush / 子树移动博弈):
- 叶子节点:(因为不能移动)。
- 对于非叶子节点 ,若其儿子节点为 ,则: [ sg(u) = \bigoplus_{i=1}^k (sg(v_i) + 1) ] 原因:从 可以走到每个 子树,相当于每个子游戏 加上一步操作(即 ),然后组合游戏的 SG 值是它们的异或和。
2. 初始局面
初始时,我们在 上额外放一个棋子(步骤 1),所以初始局面的 SG 值 = (这里 表示在给定根下节点 的 SG 值)。
但注意,根的位置会影响 的计算,因为 依赖于以 为根的子树结构。
3. 特殊能力的影响
- K 的能力:可以在任意节点加一个棋子。这相当于在 SG 值中异或上该节点的 SG 值。K 的目标是让总 SG 值 = 0(使 C 必败)。
- C 的能力:换根到相邻节点。这会改变整棵树的 SG 值计算,因为根变了,所有节点的 值都会变。
4. 问题转化
C 要必胜,必须保证:无论 K 在哪个节点加一个棋子,最终 SG 值 ≠ 0。
设初始根为 ,在 上多一个棋子,初始 SG = 。
若 C 不换根,K 可以选择在节点 加棋子,使: [ sg_y(x) \oplus sg_y(t) = 0 ] 即 。只要存在一个 使得这个等式成立,K 就能让 C 输。
所以 C 不换根能必胜的条件是:不存在任何节点 使得 。
若 C 换根到 (与 相邻),则初始 SG 值变为 。
C 必胜的条件是:对于所有节点 ,。
算法步骤
-
预处理所有根情况下的 值
用换根 DP:- 第一次 DFS 计算 (以 1 为根)。
- 第二次 DFS 换根:当根从 移到 ( 是 的儿子)时:
- 原 已知。
- 新根 的 需要计算:把 视为 的儿子,其他儿子不变,用 SG 公式: [ sg_v(u) = \left( sg_u(u) \oplus (sg_u(v)+1) \right) + 1 ] 这里 是原根 的 SG 值,去掉 子树的影响(即异或掉 ),然后加上 作为 的儿子时多的一步(+1)。
-
对每个根 ,统计 的频率
用哈希表记录每个 值出现的次数。 -
回答询问
对于 :- 检查根 时, 出现次数是否为 1(即只有 本身是这个值)。如果是,则 C 不换根就必胜(1 种方案)。
- 对 的每个邻居 ,检查根 时, 出现次数是否为 1。每个满足的邻居算 1 种方案。
- 总方案数 = 不换根(若可行)+ 换根到满足条件的邻居数。
时间复杂度
- 两次 DFS:
- 每次询问检查邻居:
- 总复杂度:,可过。
- 1
信息
- ID
- 3110
- 时间
- 4000ms
- 内存
- 1024MiB
- 难度
- 9
- 标签
- 递交数
- 9
- 已通过
- 2
- 上传者