20250627 杂题/好题
P5537 【XR-3】系统设计
小 X 需要你设计一个系统。
这个系统首先需要输入一棵 \(n\) 个点的有根树和一个长度为 \(m\) 的序列 \(a\),接下来需要实现 \(q\) 个操作。
操作分两种:
1 x l r表示设定起点为有根树的节点 \(x\),接下来依次遍历 \(l \sim r\)。当遍历到 \(i\) 时,从当前节点走向它的编号第 \(a_i\) 小的儿子。如果某一时刻当前节点的儿子个数小于 \(a_i\),或者已经遍历完 \(l \sim r\),则在这个点停住,并输出这个点的编号,同时停止遍历。2 t k表示将序列中第 \(t\) 个数 \(a_t\) 修改为 \(k\)。
第十个操作为1 1 1 5,即 \(1 \rightarrow 5 \rightarrow 6\),因此答案为 \(6\)。
这是真的 好 题。
哈希最近很常见呐
观察性质:
-
a序列会改变,但树的形态不会改变
-
给定的序列固定,其遍历的节点也随之固定
-
最终有效的(让遍历节点更改的)序列一定是 l∼r 的一个前缀。且最终答案的前缀序列的任意前缀一定合法,其余前缀不合法。也就是说具有单调性。
-
从 x 出发可以看作从根节点 root 走到 x 在接着走。
于是可以预处理出树上任意遍历前缀。接着用二分 l∼r 的前缀,并加上 root∼x 这段路径,看是否在之前的预处理中出现过。那么这个可以用 Hash 进行快速比较。
哈希可以用树状数组
Umap略慢
有 n 堆石子。除了第一堆外,每堆石子个数都不少于前一堆的石子个数。两人轮流操作。每次操作可以从一堆石子中移走任意多颗石子,但是要保证操作后仍然满足初始时的条件。没有石子可移动的人就输掉了游戏。问先手是否必胜。
设a[i]表示第i堆石子的个数,c[i]表示a[i]-a[i-1],则我们每堆可以拿的石子数即为c[i]。当我们在第i堆拿了x个时,c[i]变成了c[i]-x,c[i+1]变成了c[i+1]+x,相当于我们把第i堆中可拿的石子转移到了i+1堆,由此我们可以把此题转化为一道反着的阶梯nim游戏。
阶梯nim游戏结论:
阶梯nim的游戏结果与只看奇数堆的石子数的普通nim结果相同。
假设我先手,那么我可以按照必胜策略把奇数堆中的石子转移到偶数堆,当对方拿的时候我们分情况讨论:
对方拿奇数堆中的石子到偶数堆,相当于进行对于奇数堆的普通nim,我们继续按照必胜策略拿奇数堆中的石子;
对方把偶数堆的石子拿到奇数堆,则我们可以把这部分石子继续向下拿,对于奇数堆相当于局势没有变动。
小 A 和小 B 又想到了一个新的游戏。
这个游戏是在一个 1×n 的棋盘上进行的,棋盘上有 k 个棋子,一半是黑色,一半是白色。
最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色不同。
小 A 可以移动白色棋子,小 B 可以移动黑色的棋子,其中白色不能往左,黑色不能往右。他们每次操作可以移动 1 到 d 个棋子。
每当移动某一个棋子时,这个棋子不能跨越两边的棋子,当然也不可以出界。当谁不可以操作时,谁就失败了。
小 A 和小 B 轮流操作,现在小 A 先移动,有多少种初始棋子的布局会使他胜利呢?
不难发现,这就是nimK
把 n 堆石子用二进制数表示,统计二进制数上 1 的个数,若每一位上 1 的个数 num1mod(k+1) 全部为 0,则先手必胜,否则先手必败。
证明还是类似于 Nim 游戏:
所有物品都被取光当然是一个必败局面,即全为 0。
任意一个先手必败状态,一次操作后必然会到达必胜状态(因为游戏是交替进行的。)在某一次移动中,至少有一堆被改变,也就是说至少有一个二进制位被改变。因为最多动 k 堆,所以对于任意一个二进制位,1 的个数最多改变 k。而由于原先的总数为 k+1 的整数倍,那么改变后必然不可能是 k+1 的整数倍。所以在必败状态下必然能转移到必胜状态。
而对于先手必胜,总有一种操作使其走到必败状态,即证明有一种方法让第 i 位回到 k+1 的整数倍。有一个比较显然的性质,对于那些已经改变的 m 堆,当前位可以自由选择 1 或 0。我们设除去已经更改的 m 堆,剩下堆 i 位上 1 的总和为 sum。考虑分类讨论:
sum≤k−m,此时我们可以将堆上的 1 全部拿掉,让后让拿 m 堆得 i 位全部为 0。
sum>k−m,此时我们在之前改变的 m 堆中选择 k+1−sum 堆,将他们的第 i 位设置成 1。剩下的设置成 0。由于 k+1−sum<k+1−(k−m)<m+1,也就是说 k+1−sum≤m,故这是可以达到的。
有 n 枚石子。两位玩家定了如下规则进行游戏:
Mirko 先取一次,Slavko 再取一次,然后 Mirko 再取一次,两人轮流取石子,以此类推;
Mirko 在第一次取石子时可以取走任意多个;
接下来,每次至少要取走一个石子,最多取走上一次取的数量的 2 倍。当然,玩家取走的数量必须不大于目前场上剩余的石子数量。
取走最后一块石子的玩家获胜。
双方都以最优策略取石子。Mirko 想知道,自己第一次至少要取走几颗石子最终才能够获胜。
没写完,明天写
浙公网安备 33010602011771号