E. MEX Count
Codeforces 第 1034 轮 (Div. 3) E
问题描述
每组测试时间限制: 3 秒 每组测试内存限制: 256 MB
定义一个数组的 MEX (最小未出现值) 为数组中未出现的最小非负整数。例如:
- 因为 不在数组中。
- 因为 和 在数组中,但 不在。
- 因为 , , , 和 都在数组中,但 不在。
给定一个大小为 的非负整数数组 。
对于所有的 (),计算从 中移除恰好 个值后, 可能有多少个不同的值。
输入
第一行包含一个整数 () — 测试用例的数量。
每个测试用例的第一行包含一个整数 () — 数组 的大小。
每个测试用例的第二行包含 个整数 ()。
保证所有测试用例的 的总和不超过 。
输出
对于每个测试用例,输出一行包含 个整数 — 对于 ,移除恰好 个值后 可能的值的数量。
题解
关键洞察
与其考虑从数组中移除元素,不如将其看作是向一个初始为空的数组中添加元素。这个角度使问题变得更加清晰。
理解 MEX 的要求
为了使一个数组的 ,它必须满足两个条件:
- 所有从 到 的值必须存在于数组中
- 值 必须不存在于数组中
算法概述
统计可用元素:首先,计算原始数组中每个值出现的次数。
计算所需元素:对于每个可能的 MEX 值 :
- 我们需要至少一个从 到 的每个值的出现
- 我们必须避免添加任何值 的出现
找到有效范围:对于每个 MEX 值 ,确定在保持 的情况下可以添加的元素范围。
使用差分数组:我们使用差分数组来高效地跟踪哪些位置可以实现每个 MEX 值。
前缀和:最后,计算差分数组的前缀和,以获得每个 MEX 值的最终计数。
时间复杂度
- 时间:
- 空间: