我真的博了

其实标题指的是博弈论。

[AGC002E] Candy Piles

桌子上有 \(N\) 堆糖果。每堆糖果有 \(a_i\) 颗糖果。

Snuke 和 Ciel 正在玩游戏。他们轮流走。Snuke 先走。在每个回合中,当前玩家必须执行以下两个操作之一:

  • 选择剩余糖果数量最多的一堆,然后吃掉那堆糖果中的所有糖果。
  • 从每堆剩下的一颗或多颗糖果中,吃一颗糖果。

吃了桌上最后一块糖的玩家输掉了比赛。确定如果两个玩家都以最佳方式玩游戏,哪个玩家会赢。

sol

牛逼题目。

你可以先把石子的个数从大到小排序,如下图。

转化成网格图就是

image

那么上面的实线就是必败点,我们相当于每次往右走或者往上走 (相当于吃一堆或者全部吃一颗)。

那么向上走和向右走都是必败点的点就是必胜点,反之就是必败点,画出来长这样(O 为必败):

注意到一个对角线都是一样的,所以我们直接找到一个最大的正方形使得其够不着边界。

然后直接设其右上方顶点为 (i,i) 。当它到最上面且不在边界上的点的距离和最右面且不在边界上的点的距离其中一个为奇数时,这个点为必败点,反之这个点为必胜点。

CF794E Choosing Carrot

下个月就是奶牛Z的生日啦,为了给奶牛Z购买生日礼物,奶牛A和奶牛B决定去挑选奶牛Z最喜欢的青草来作为送给奶牛Z的生日礼物。
现在,奶牛A和奶牛B买来了n堆青草,从左数起,第i堆青草的甜度为ai。奶牛A认为奶牛Z喜欢甜的青草,而奶牛B认为奶牛Z喜欢不甜的青草。因此,奶牛A希望选出来的青草是最甜的,奶牛B希望选出来的是最不甜的青草。
为了解决这个问题,奶牛A与奶牛B决定玩一个游戏,他们俩每次可以从两端的青草开始,选择其中一堆并把这一堆青草吃掉,最后剩下的那一堆青草就是送给奶牛Z的生日礼物,奶牛A先开始吃。
在玩游戏之前,奶牛B去上了一次厕所,奶牛A乘机进行了K次操作,每次操作也是按照要求从这些草堆当中,选择两端的草堆并吃掉其中一堆。在奶牛B回来之后,同样也是奶牛A先开始吃。
奶牛A想知道,对于每一个K(0≤K≤n-1),最后送给奶牛Z的青草甜度分别是多少?

sol

最简单。

讨论 \(k=0\) 的情况:

\(mid=(n+1)/2\)

奇数的答案是 \(\max(\min(a_{mid},a_{mid-1}),\min(a_{mid},a_{mid+1}))\)

偶数的答案是 \(\max(a_{mid},a_{mid-1})\)

然后对于这个 \(k\) 的不同,相当于就是把区间增长了,反正写个 st 表当 rmq 做就行了。

[ARC116F] Deque Game

给定 \(K\) 个数列。第 \(i\) 个数列 \(A_i\) 的长度为 \(N_i\)

高桥君和青木君将用这些数列进行游戏。直到所有数列都变为长度 \(1\),高桥君和青木君轮流进行以下操作:

  • 选择一个长度至少为 \(2\) 的数列,删除其第一个元素或最后一个元素。

高桥君先手。高桥君希望最大化最后剩下的 \(K\) 个元素的总和,青木君则希望最小化该总和。

当双方都采取最优策略时,请输出最后剩下的 \(K\) 个元素的总和。

sol

困难至极。

发现当 \(k=1\) 时跟上面的是一样的,所以奇偶数的讨论可以直接扔过来。

当这个队列长度为奇数时,且先手先手时,答案是 \(\min(\max(a_{mid},a_{mid-1}),a_{mid}) \leq a_{mid}\)

当这个队列长度为奇数时,且先手后手时,答案是 \(\max(\min(a_{mid},a_{mid-1}),a_{mid}) \geq a_{mid}\)

所以在这个奇数的情况下先手更优一点。

然后你考虑偶数的情况,偶数是先手更优一些。

所以他们两个会优先把偶数给吃完,然后再吃奇数。

但是偶数每吃掉一个会导致先后手置换,所以你需要按照这个的 先手答案 - 后手答案排序去吃,这样一定是最优的。

然后你再去吃奇数,这个不会换先后手顺序,直接算就好了。

[AGC010D] Decrementing

黑板上写有 \(N\) 个整数。第 \(i\) 个整数为 \(A_i\),这些数的最大公约数为 \(1\)

高桥君和青木君用这些数进行游戏。游戏由高桥君先手,双方轮流进行如下操作:

  • 从黑板上选择一个大于等于 \(2\) 的数,将其减去 \(1\)
  • 然后,计算黑板上所有数的最大公约数 \(g\),并将所有数都除以 \(g\)

当黑板上所有数都变为 \(1\),且无法再进行操作时,无法操作的一方判负。假设双方都采取最优策略,问哪一方会获胜。

sol

儿子题目。

\(\sum_{i=1}^N (A_i-1)\),如果没有除去最大公约数的话就是看奇偶性,奇数先手必胜。

但是现在有这个除法了,不难发现只有除去 \(2\) 的倍数才能改变奇偶性,所以说看什么情况才能除去 \(2\)

发现除去 2 的情况当且仅当只有一个奇数,遇到这种情况递归处理就好了。

[AGC010F] Tree Game

有一棵包含 \(N\) 个顶点的树,顶点编号为 \(1\)\(N\)。此外,第 \(i\) 条边连接了顶点 \(a_i\) 和顶点 \(b_i\)

现在,每个顶点 \(i\) 上放有 \(A_i\) 个石子。高桥君和青木君打算用这棵树进行游戏。

首先,高桥君选择一个顶点,并将棋子放在该顶点上。之后,从高桥君开始,双方轮流进行以下操作:

  • 从当前棋子所在的顶点取走一个石子。
  • 然后选择一个与当前顶点相邻的顶点,将棋子移动到该顶点。

如果当前棋子所在的顶点没有石子可取,则无法进行操作,该玩家判负。请你求出所有高桥君可以选择并保证获胜的初始顶点编号,并按升序输出。

sol

你先去考虑菊花的的情况,那么此时先手必胜的情况就是根的所有儿子的最小值要比自己的石子数量要小。

然后考虑从菊花扩展到树的情况,先不考虑叶子。

如果先手肯定不会将其移动到一个先手必胜的情况上,那么我们只需要考虑移到后手必胜的情况。

移过去了过后后手肯定会移回来,不然对手也送了。

那就又是看所有后手必胜的节点的石子最小值是否小于当前节点的石子。

放了 \(n^2\) 随便跑跑就过了。

CF1934D2 XOR Break — Game Version

交互。

Alice 和 Bob 正在玩一个游戏。游戏开始时有一个正整数 \(n\),两位玩家轮流操作。每一轮,游戏按如下顺序进行:

  • 当前玩家将整数 \(p\) 拆分成两个整数 \(p_1\)\(p_2\),其中 \(0 < p_1 < p\)\(0 < p_2 < p\),并且 \(p_1 \oplus p_2 = p\)
  • 如果不存在这样的 \(p_1\)\(p_2\),则当前玩家输掉游戏。
  • 否则,对手从 \(p_1\)\(p_2\) 中任选一个整数。
  • 游戏继续,对手尝试对被选中的整数进行拆分。

作为 Alice,你的目标是获胜。你最多可以执行 \(63\) 次拆分操作。你可以选择先手或后手。系统将为 Bob 操作。

sol

纯纯的儿子题,自己都能做的。

位运算直接拆位!然后发现为二的正整数幂的时候就拆不了了。

你直接大胆猜结论,\(\text{popcount}\ \text{mod}\ 2 = 1\) 时先手必胜,通过查看题解证明

实际上可以随便拿奇偶性去证明,这里懒得写了。

然后你就可以每次拆最高位凌迟对面,这样可以保证每次都可以少一个最高位。

CF1776I Spinach Pizza

Alberto 和 Beatrice 两兄妹必须一起吃菠菜披萨。但是他们都不喜欢吃菠菜,所以都想尽量少吃。

披萨的形状是一个由 \(n\) 个位于平面的整数坐标的顶点 \((x_1, y_1), \, (x_2, y_2), \, \dots, \, (x_n, y_n)\) 组成的严格凸多边形。

兄妹俩决定以下面的方式吃掉披萨:从 Alberto 开始,兄妹轮流选择披萨剩余部分的一个顶点,吃掉由其两条相邻边决定的三角形(详情请查看样例解释)。在这样的前 \(n - 3\) 轮,披萨上的顶点每轮会减少一个。在第 \((n - 2)\) 轮,披萨全部被吃掉,游戏结束。

假设 Alberto 和 Beatrice 以最优策略吃披萨,那么谁会吃掉最多一半披萨?你应该找出谁会赢,并帮他们适当地选择披萨片。请注意,如果 Alberto 和 Beatrice 都以最有策略吃披萨,那么他们最终吃掉的面积有可能正好是一半。

sol

这个是邪恶算几题。

你发现每次只需要选相邻三个点所组成的最小的披萨就一定是对的。

为什么?你发现吃掉一片最小的披萨后新生成的披萨一定比原来吃掉的大,这个可以用调整法证明。

就是能吃的披萨最终只会越吃越大。

所以奇数块披萨后手必胜,否则先手必胜。

[ABC398G] Not Only Tree Game

给定一个简单无向图 \(G\),包含 \(N\) 个顶点和 \(M\) 条边,顶点编号为 \(1\)\(N\),边编号为 \(1\)\(M\)。其中第 \(i\) 条边连接顶点 \(U_i\)\(V_i\)。初始时,\(G\) 中不包含奇闭路。

青木君和高桥君将使用这个图 \(G\) 进行游戏。两人轮流执行以下操作(青木君为先手):

  • 选择满足 \(1 \leq i < j \leq N\) 的整数对 \((i, j)\),且满足以下两个条件:

    • \(G\) 当前不包含连接顶点 \(i\) 和顶点 \(j\) 的边;
    • \(G\) 中添加连接顶点 \(i\) 和顶点 \(j\) 的边后,\(G\) 仍然不形成奇闭路;

    然后,将这条边添加到 \(G\) 中。

无法进行操作的一方判负,另一方获胜。请判断在双方采取最优策略的情况下,哪一方会获胜。

sol

纯粹的史,详见 https://www.cnblogs.com/degch5zm/p/19133407

[ABC261Ex] Game on Graph

有一个包含 \(N\) 个顶点和 \(M\) 条边的有向图。第 \(i\) 条边是从顶点 \(A_i\) 指向顶点 \(B_i\) 的有向边,权重为 \(C_i\)

最初,棋子被放置在顶点 \(v\) 上。高桥君和青木君轮流按如下规则移动棋子:

  • 如果当前棋子所在的顶点没有出边,则游戏结束。
  • 如果当前棋子所在的顶点有出边,则可以选择其中一条边,沿该边移动棋子。

游戏由高桥君先手。高桥君的目标是在有限步内结束游戏,并且尽量使经过的边权和最小;青木君的目标是尽量让游戏无法在有限步内结束,如果无法做到,则尽量使经过的边权和最大。
更严格地说,目标如下:
高桥君优先保证游戏能在有限步内结束,如果可以做到,则尽量使经过的边权和最小。
青木君优先保证游戏无法在有限步内结束,如果无法做到,则尽量使经过的边权和最大。
(如果棋子多次经过同一条边,则该边的权重会被多次累加。)

请判断当两人都采取最优策略时,游戏是否会在有限步内结束。如果会结束,请输出游戏过程中经过的边权和。

sol

很典的博弈论,我怎么感觉 zjk 讲过的???

如果这个图是 dag,你显然是可以直接 dp 做的。

但是现在有环,这也不是很影响,我们分别记一个 \(f,g\) 为先手行动的最小值和后手行动的最大值。

\(f,g\) 的转移在 dag 上是显然的,但是对于图也没变多少,初始值全设为 \(\text{inf}\),初始节点两个都为 \(0\)

\(f\) 是有一个 \(g\) 就能转移,\(g\) 是要所有 \(f\) 都有才能转移,多源 \(bfs\) 一下就可以 \(O(n)\) 做了,复杂度你可以把它当分层图上的 \(bfs\) 去理解。

注意 \(g\) 的最大值要动态维护一下,图要建反图。

posted @ 2025-10-07 15:57  degchuzm  阅读(7)  评论(0)    收藏  举报