题目大意
题目描述
Evelyn 和 Todd 正在进行一场游戏。游戏开始时有一个包含 个整数的多重集合 ,以及一个初始为空的数组 。两人轮流进行操作,每回合当前玩家从 中选择一个元素,将其添加到数组 的末尾,并将其从 中移除。
当 为空时游戏结束。此时计算数组 中的逆序对数量(即满足 且 的索引对的数量)。如果逆序对数量为偶数,则 Evelyn 获胜;如果为奇数,则 Todd 获胜。
两人都充分了解游戏并采用最优策略进行。对于给定的多重集合 ,有以下四种可能的结果:
-
无论谁先手,Evelyn 必胜(输出 E)。
-
无论谁先手,Todd 必胜(输出 T)。
-
无论先手是谁,先手玩家必胜(输出 F)。
-
无论先手是谁,后手玩家必胜(输出 S)。
输入格式
第一行包含一个整数 (),表示多重集合 中的元素数量。
第二行包含 个整数 (),表示多重集合 中的元素。
输出格式
输出一个大写字母,表示在双方最优策略下的游戏结果(E、T、F 或 S)。
样例一
输入
1 | 3 |
输出
1 | E |
样例一解释
无论 Evelyn 和 Todd 如何从多重集合 中选择元素,最终得到的数组都将是 。由于该数组中没有逆序对(数量为 ,是偶数),因此无论谁先手,Evelyn 都将获胜。
样例二
输入
1 | 3 |
输出
1 | S |
思路讲解
第 49 届 ICPC区域赛沈阳站——D. Dot Product Game
不过好像其实没什么关系。
当一个数被塞入这个 v 之中的时候, 其实,其对 inv 的贡献已经确定了。

呃,不过我感觉我们的思路有点问题,我们来看看 gemini 的回答:
以下是根据您的要求对该博弈论问题进行的详细分析与解答:
题目描述 (Problem Description)
给定一个包含 个整数的多重集合 。Evelyn 和 Todd 轮流从中取出一个数字并追加到初始为空的数组 的末尾。当集合 为空时游戏结束。
如果最终数组 中的逆序对数量为偶数,则 Evelyn 获胜;如果逆序对数量为奇数,则 Todd 获胜。假设两人均采取最优策略,请判断在给定的 下游戏的最终结果:
E: Evelyn 必胜(不论谁先手)。T: Todd 必胜(不论谁先手)。F: 先手必胜(不论是 Evelyn 还是 Todd)。S: 后手必胜(不论是 Evelyn 还是 Todd)。
解题思路 (Chosen Approach)
本题的核心在于分析“谁能在游戏末尾掌握逆序对奇偶性的选择权”。
设 为集合的总元素数, 为集合中出现频率为奇数的数字的种类数。
当游戏进行到最后只剩下 个元素时,如果这两个元素不相同,那么当前行动的玩家可以通过选择先放哪一个、后放哪一个,直接改变最终数组的逆序对奇偶性(相邻交换不同元素必然使逆序对数量加一或减一)。因此,谁能在剩下 个不同元素时行动,谁就掌握了必胜的控制权。
基于此,我们可以分情况讨论:
- 当 时:
集合中几乎所有元素都可以两两配对。Evelyn 的目标是使得逆序对为偶数。无论谁先行动,Evelyn 都可以采取“配对模仿策略”(即对手出什么,她只要有相同的就跟着出)。这样最终构成的数组会是由一对对相同的数字组成,而形如 的数组,其逆序对总数必然是偶数。Todd 无法打破这种配对来强制创造奇数个逆序对。因此,Evelyn 必胜(输出E****)。 - 当 时:
集合中存在足够多无法配对的元素,这意味着“控制者”总能通过合理的策略,确保在最后剩下 个元素时它们互不相同,从而行使奇偶性选择权并赢下游戏。
- 如果 为偶数:当剩下 个元素时,恰好轮到先手行动(因为先手在剩余偶数个元素时操作)。因此先手可以控制最终的奇偶性,先手必胜(输出
F****)。 - 如果 为奇数:当剩下 个元素时,恰好轮到后手行动。因此后手可以控制最终的奇偶性,后手必胜(输出
S****)。
代码实现 (Code Implementation)
1 |
|
复杂度与细节分析 (Explanation)
- 时间复杂度:。我们只需要遍历一次长度为 的输入数据来统计每个元素的出现次数,然后再遍历一次大小为 的频次数组来统计奇数频次元素的种类数 。总体时间为线性。
- 空间复杂度:。开辟了一个大小为 的数组
freq来存放每种数字的出现次数,内存开销极小。 - 边界情况处理:
- 全同元素(例如样例一的 ):此时 ,属于 的情况,程序会正确输出
E。因为全同元素的逆序对只能是 (偶数)。 - 全异元素(例如样例二的 ):此时 且 (奇数),程序会正确走到最后的分支并输出
S,完美符合组合博弈推论。代码逻辑涵盖了所有离散状态,无遗漏的边界漏洞。
- 全同元素(例如样例一的 ):此时 ,属于 的情况,程序会正确输出
题意
给定一个多重集合 S,两个人轮流从中取一个数,按取出的顺序拼成数组 v。
当 S 为空时,统计 v 的逆序对个数。
- 逆序对个数是偶数,Evelyn 赢。
- 逆序对个数是奇数,Todd 赢。
两个人都最优,要求判断最终属于哪一种情况: E:Evelyn 不管先后手都赢。T:Todd 不管先后手都赢。F:先手赢。S:后手赢。
核心做法
设odd表示“出现次数为奇数的不同数字有多少个”。
结论非常简单:- 如果
odd <= 1,输出E - 如果
odd >= 2且odd是偶数,输出F - 如果
odd >= 3且odd是奇数,输出S
T这种情况不会出现。
为什么只看奇数次出现的数
如果某个值还有至少两份,那么一方取了它一份以后,另一方立刻取同样的值一份。
这两步对逆序对奇偶性的贡献是一样的,因为第二次取这个值时,比它小的剩余元素个数没有变化,所以两次贡献异或后为0,等于完全抵消。
所以,所有“成对出现”的副本都可以看成无效,只剩下每个出现奇数次的值各保留一份。于是原问题等价于:
有odd个互不相同的数,每个数只出现一次,轮流取数,最后看逆序对奇偶性。
为什么答案只和odd的奇偶性有关
当剩下m个互不相同的数时,如果当前取的是第k小的数,那么它会和之后所有比它小的数形成逆序对,所以这一手对最终奇偶性的贡献就是k mod 2。
于是: m = 1时,只能取唯一的数,贡献一定是0,最终奇偶性固定为偶数。m = 2时,当前玩家可以取较小的数或较大的数,分别对应贡献0和1,因此当前玩家可以直接决定最终奇偶性。- 对于
m >= 3,当前玩家总能选到贡献为0的位置,也总能选到贡献为1的位置,所以“谁能决定最终奇偶性”会随着m每减一交替一次。
从m = 2开始可知: m为偶数时,当前玩家能决定最终奇偶性。m为奇数且m >= 3时,当前玩家不能决定,决定权在对手手里。
再映射回题目:odd = 0或1:最终一定是偶数,所以输出Eodd为偶数且至少2:先手能决定奇偶性,所以输出Fodd为奇数且至少3:后手能决定奇偶性,所以输出S
代码实现(C++20)
1 |
|
复杂度
- 时间复杂度:
O(N) - 空间复杂度:
O(N)
样例对应
样例一:
1 | 输入 |
解释:只有数字 1,它出现了 3 次,所以 odd = 1,答案是 E。
样例二:
1 | 输入 |
解释:三个数都只出现一次,所以 odd = 3,属于奇数且不少于 3,答案是 S。


我们发现,所有两两配对的部分,其贡献都为 0。
贡献为 0 的部分,就把它丢掉,少即是好。

AC代码
AC
https://codeforces.com/gym/106416/submission/368226851
1 | /** |