PrepStack · Markdown HTML

前缀和 / 区间聚合

前缀、差分与哈希状态 · HTML

数学 / 逻辑形态

定义 prefix[0]=0,prefix[i+1]=prefix[i]+a[i]。半开区间 [l,r) 的和为 prefix[r]-prefix[l]。

识别信号

容易误判的相似信号

SignalWhy it is different
频繁点更新普通前缀更新一个值要改后续全部;改用 Fenwick 或 segment tree。
区间最大值max 没有可逆减法,不能由两个普通前缀恢复任意区间。

核心不变量

prefix[i] 始终表示恰好前 i 个元素 a[0:i] 的聚合;索引 i 是数量而不是原数组元素位置。

状态、转移与处理顺序

ItemDefinition
State长度 n+1 的 prefix、查询端点 l/r,以及统一的半开区间约定。
Transition构建时 prefix[i+1]=prefix[i]+a[i];查询时右前缀减左前缀。
Frontier / order构建前沿从左到右推进;一旦建成,所有区间查询互相独立。

Python 骨架

def build_prefix(values):
    prefix = [0]
    for value in values:
        prefix.append(prefix[-1] + value)
    return prefix

def range_sum(prefix, left, right):
    # Sum over half-open interval [left, right).
    if not (0 <= left <= right < len(prefix)):
        raise IndexError('invalid range')
    return prefix[right] - prefix[left]

正确性思路

  1. 由递推归纳,prefix[i] 等于 a[0]+…+a[i-1]。
  2. prefix[r] 包含 [0,l) 与 [l,r),减去 prefix[l] 正好消去共同前缀。
  3. 每次查询只访问两个已验证的前缀,因此返回精确区间和。

复杂度

TimeSpaceParameters
预处理 O(n),每次查询 O(1)O(n)n 为数组长度,q 次查询总计 O(n+q)。

边界条件

错误模式

PatternWhy it fails / fix
prefix 长度只建 n缺少 0 哨兵导致 l=0 特判和大量 off-by-one。
混用闭/半开区间先写清 [l,r) 或 [l,r],不要靠记忆套公式。
动态更新仍重建前缀高频更新下复杂度退化,应换动态区间结构。

选择与排除规则

相关模板

RelationTemplateBoundary
动态化Fenwick Tree / 树状数组前缀和需要点更新
代数基础前缀状态 + 哈希频次先理解区间为何是两个前缀的差。
代数同构Rolling Hash / Rabin–Karp理解由两个前缀提取区间摘要
区间查询替代定长滑动窗口只需离线固定窗和,前缀差也可 O(1) 每窗。
可逆静态替代Sparse Table 静态 RMQ操作是加法

原创微型例子

环节内容
Result区间和为 5。
Setup值 [3,-1,4,2],询问半开区间 [1,4)。
Traceprefix=[0,3,2,6,8];取 8-3。

Recall prompts

我的补充