1 条题解
-
0
C. Good Prefixes 详细题解
题目重述
给定一个长度为 的数组 ,定义数组 是“好的”,如果存在某个元素等于其余所有元素的和(若没有其他元素,则和为 )。例如 是好的因为 。需要统计数组 的所有非空前缀中,有多少个是好的。
核心观察
对于一个长度为 的前缀 ,设其总和为 。该前缀是好的当且仅当存在某个下标 (),使得:
这是因为“其余元素的和”等于总和减去该元素本身。所以条件等价于 是偶数且 对于某个 成立。
因此,前缀 是好的 为偶数且 出现在前缀 的元素中(即 等于某个 ,)。
算法思路
我们顺序扫描数组,维护:
- 当前前缀和 。
- 一个哈希集合(或布尔数组),存储当前前缀中已经出现过的元素值。
对于每个位置 (从 到 ):
- 将 加入 ,同时将 插入 。
- 检查 是否为偶数,并且 是否在 中。若是,则当前前缀是好的,答案加 。
由于 可达 ,且所有测试用例的总 不超过 ,该算法 时间, 空间(哈希集合),完全可行。
正确性证明
- 必要性:如果前缀 是好的,则存在 使得 ,推出 ,故 为偶数且 ,因此 必然出现在前缀中。
- 充分性:若 为偶数且 等于某个 (),则 ,其余元素的和为 ,满足定义。因此前缀 是好的。
所以判断条件正确。
复杂度分析
- 每个测试用例遍历一次数组,每个元素进行一次哈希集合插入和查询,时间复杂度 。
- 空间复杂度 用于存储集合中的元素。
- 所有测试用例的 总和 ,总体复杂度非常快。
示例验证
以第四个测试用例 为例:
- :,偶数, 在集合中( 出现),计数 。
- :,奇数,不满足。
- :,奇数,不满足。
- :,偶数, 在集合中(),计数 。
- :,偶数, 在集合中(),计数 。 总数 ,与输出一致。
注意事项
- 可以为零,此时 可能为偶数且 ,若 出现过(一定出现过,因为 可能为 ),则前缀被认为是好的。例如 是好的,符合题意。
- 由于元素值可达 ,使用
long long存储和,并使用unordered_set或map存储出现过的值。
总结
本题的关键在于将“存在某个元素等于其余元素的和”转化为 ,从而只需检查 是否为偶数且 是否已出现。通过顺序扫描并维护哈希集合,可以在线性时间内统计所有好前缀的个数。该方法简单高效,适用于较大的数据范围。
- 1
信息
- ID
- 6951
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者