0%

2025_ICPC_NERC_Northern_Eurasia_Finals——F. Fragmented Nim(先碰到弹性堆的那一方,一定赢了,因为他不仅可以制造陷阱,还可以逼迫对手进入陷阱)

题目大意

经典的Nim游戏规则如下。有nn堆石头,第ii堆最初包含aia_i个石头。Alice和Bob轮流进行; Alice先行动。在他们的轮次中,玩家选择任意非空堆并从中移除任意正数个石头。拿到最后一块石头的玩家获胜。

在玩了很多Nim游戏之后,Alice和Bob决定稍微改变规则。在这一变体中,轮到的玩家不选择堆 — — 他们的对手为他们选择!然而,玩家仍然可以决定从那堆中移除多少石头。

Alice仍然先手。在Alice的轮次中,Bob选择任意非空堆,然后Alice从中移除任意正数个石头。同样地,在Bob的轮次中,Alice选择任意非空堆,然后Bob从中移除任意正数个石头。

对于给定的石头堆配置,确定如果两名玩家都遵循最佳策略,谁将获胜。

思路讲解

这种题目是这样子的,先碰到弹性堆的那一方,一定赢了。先碰到弹性堆的那一方一定赢了,这个是因为你不仅可以制造陷阱,还可以逼迫对手进入陷阱,这个是最厉害的地方。

  1. 全是 1 的情况bigs=0bigs = 0):每回合只能取 1 颗,总共 nn 回合,奇数轮 Alice 赢,偶数轮 Bob 赢——即 nn 为奇则 Alice 胜。

  2. 存在 >1>1 的堆时bigs1bigs \geq 1):当一个玩家被指向一个大堆(ai>1a_i > 1),他可以选择"全取"(消灭堆)或"留 1"(变成 size-1 堆)。这意味着他能自由控制对手下一步面对的 onesones 的奇偶性——因此被指向大堆的人必赢
    既然指向大堆 = 给对方胜利,所以"选堆方"(chooser)一定会优先把对手指向 size=1 的堆。双方轮流消耗 size-1 堆,直到 size-1 堆耗尽,最终被迫指向大堆的那一方就输了。
    消耗 onesones 个 size-1 堆需要 onesones 轮。若 onesones 为偶数,Alice 仍是 mover,获得大堆 → Alice 赢;若 onesones 为奇数,Bob 是 mover → Bob 赢

在变体 Nim 的纯弹性子游戏里,当前玩家必胜,本质上靠的是一个两步连招

第一步(你是操作者):对手把你指到某个弹性堆,你把它削成 1。你制造了一个"陷阱"。

第二步(你变成了选堆方):下一回合,角色互换——你来选堆,对手来操作。你把对手指向那个你刚造出来的大小为 1 的堆。对手被迫吃掉它,白白浪费一个回合。

净效果:两个回合过去了,一个弹性堆被消灭,又轮到你了。你从 ff 个弹性堆的先手,变成了 f1f-1 个弹性堆的先手。循环往复,直到只剩最后一个弹性堆,你直接清空获胜。

这个连招之所以成立,是因为操作者和选堆方的角色每回合交替。你当操作者时布下陷阱,下一回合你当选堆方时把对手推进陷阱。

AC代码

AC
https://codeforces.com/contest/2181/submission/362136313

心路历程(WA,TLE,MLE……)