1 条题解

  • 0
    @ 2026-5-5 21:07:41

    C. Good Prefixes 详细题解

    题目重述

    给定一个长度为 nn 的数组 aa,定义数组 [x1,x2,,xm][x_1, x_2, \dots, x_m] 是“好的”,如果存在某个元素等于其余所有元素的和(若没有其他元素,则和为 00)。例如 [1,6,3,2][1,6,3,2] 是好的因为 6=1+3+26 = 1+3+2。需要统计数组 aa 的所有非空前缀中,有多少个是好的。

    核心观察

    对于一个长度为 ii 的前缀 [a1,a2,,ai][a_1, a_2, \dots, a_i],设其总和为 Si=j=1iajS_i = \sum_{j=1}^{i} a_j。该前缀是好的当且仅当存在某个下标 pp1pi1 \le p \le i),使得:

    ap=Siap2ap=Si.a_p = S_i - a_p \quad \text{即} \quad 2a_p = S_i.

    这是因为“其余元素的和”等于总和减去该元素本身。所以条件等价于 SiS_i 是偶数且 ap=Si/2a_p = S_i/2 对于某个 pp 成立。

    因此,前缀 ii 是好的     \iff SiS_i 为偶数且 Si/2S_i/2 出现在前缀 ii 的元素中(即 Si/2S_i/2 等于某个 aja_j1ji1 \le j \le i)。

    算法思路

    我们顺序扫描数组,维护:

    • 当前前缀和 sumsum
    • 一个哈希集合(或布尔数组)seenseen,存储当前前缀中已经出现过的元素值。

    对于每个位置 ii(从 11nn):

    1. aia_i 加入 sumsum,同时将 aia_i 插入 seenseen
    2. 检查 sumsum 是否为偶数,并且 sum/2sum/2 是否在 seenseen 中。若是,则当前前缀是好的,答案加 11

    由于 nn 可达 2×1052\times 10^5,且所有测试用例的总 nn 不超过 2×1052\times 10^5,该算法 O(n)O(n) 时间,O(n)O(n) 空间(哈希集合),完全可行。

    正确性证明

    • 必要性:如果前缀 ii 是好的,则存在 pp 使得 ap=jpaj=Siapa_p = \sum_{j\neq p} a_j = S_i - a_p,推出 2ap=Si2a_p = S_i,故 SiS_i 为偶数且 Si/2=apS_i/2 = a_p,因此 Si/2S_i/2 必然出现在前缀中。
    • 充分性:若 SiS_i 为偶数且 Si/2S_i/2 等于某个 apa_p1pi1 \le p \le i),则 ap=Si/2a_p = S_i/2,其余元素的和为 Siap=Si/2=apS_i - a_p = S_i/2 = a_p,满足定义。因此前缀 ii 是好的。

    所以判断条件正确。

    复杂度分析

    • 每个测试用例遍历一次数组,每个元素进行一次哈希集合插入和查询,时间复杂度 O(n)O(n)
    • 空间复杂度 O(n)O(n) 用于存储集合中的元素。
    • 所有测试用例的 nn 总和 2×105\le 2\times 10^5,总体复杂度非常快。

    示例验证

    以第四个测试用例 a=[0,1,2,1,4]a = [0,1,2,1,4] 为例:

    • i=1i=1sum=0sum=0,偶数,0/2=00/2=0 在集合中(00 出现),计数 +1+1
    • i=2i=2sum=1sum=1,奇数,不满足。
    • i=3i=3sum=3sum=3,奇数,不满足。
    • i=4i=4sum=4sum=4,偶数,22 在集合中(a3=2a_3=2),计数 +1+1
    • i=5i=5sum=8sum=8,偶数,44 在集合中(a5=4a_5=4),计数 +1+1。 总数 =3=3,与输出一致。

    注意事项

    • aia_i 可以为零,此时 SiS_i 可能为偶数且 Si/2=0S_i/2=0,若 00 出现过(一定出现过,因为 a1a_1 可能为 00),则前缀被认为是好的。例如 [0][0] 是好的,符合题意。
    • 由于元素值可达 10910^9,使用 long long 存储和,并使用 unordered_setmap 存储出现过的值。

    总结

    本题的关键在于将“存在某个元素等于其余元素的和”转化为 2ap=Si2a_p = S_i,从而只需检查 SiS_i 是否为偶数且 Si/2S_i/2 是否已出现。通过顺序扫描并维护哈希集合,可以在线性时间内统计所有好前缀的个数。该方法简单高效,适用于较大的数据范围。

    • 1

    信息

    ID
    6951
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者