1 条题解

  • 0
    @ 2026-10-23 20:48:06

    重量区间

    算法思路

    设前缀和 s0=0s_{0}=0,si=∑j=1iajs_{i}=\sum_{j=1}^{i}a_{j}。

    区间 [l,r][l,r] 的重量为 kk,等价于 sr−sl−1=ks_{r}-s_{l-1}=k,整理得

    sl−1=sr−k.s_{l-1}=s_{r}-k.

    因此,从左到右枚举右端点 rr,只需统计此前有多少个前缀和等于 sr−ks_{r}-k。

    使用哈希表 cnt[x]\mathrm{cnt}[x] 记录已经出现的前缀和 xx 的次数。初始令 cnt[0]=1\mathrm{cnt}[0]=1,表示空前缀。

    每读入一个元素并更新当前前缀和 ss,先将 cnt[s−k]\mathrm{cnt}[s-k] 加入答案,再将 cnt[s]\mathrm{cnt}[s] 增加 11。

    必须先查询再更新,避免在 k=0k=0 时统计空区间。前缀和、kk 和答案统一使用 64 位整数。

    正确性证明

    处理右端点 rr 时,哈希表恰好记录 s0,s1,…,sr−1s_{0},s_{1},\ldots,s_{r-1} 的出现次数。

    每个满足 sj=sr−ks_{j}=s_{r}-k 的下标 j<rj<r,都唯一对应一个重量为 kk 的非空区间 [j+1,r][j+1,r]。因此,cnt[sr−k]\mathrm{cnt}[s_{r}-k] 正好是以 rr 为右端点的合法区间数量。

    枚举所有右端点后,每个合法区间恰好被统计一次,所以算法正确。

    复杂度分析

    每个元素进行常数次哈希表操作,期望时间复杂度为 O(n)O(n)。

    哈希表最多记录 n+1n+1 个不同的前缀和,空间复杂度为 O(n)O(n)。

    • 1

    信息

    ID
    721
    时间
    1000ms
    内存
    256MiB
    题目 Rating
    1300
    标签
    递交数
    47
    已通过
    22
    上传者