高效区间操作应按需选工具:单点更新+前缀和用树状数组;频繁区间修改+求和用线段树;操作混杂或数据小用分块;差分+树状数组可拓展区间更新能力。

要高效支持数组的区间操作,关键不是堆砌结构,而是匹配操作类型选对工具。单点更新+前缀和查询,树状数组最轻量;频繁区间修改+区间求和,线段树更直接;数据量小或操作稀疏,分块反而更稳。
树状数组:单点更新与前缀和查询的黄金组合
树状数组(Fenwick Tree)本质是用二进制低位(lowbit)组织前缀和的紧凑结构。每个位置 tree[i] 存储一段长度为 lowbit(i) 的区间和,例如:
– tree[8] 管辖 a[1..8],
– tree[6](二进制 110)lowbit=2,管辖 a[5..6]。
更新时沿 i += lowbit(i) 向上跳,查询时沿 i -= lowbit(i) 向下累加,时间复杂度稳定 O(log n),空间仅 O(n)。它天然适合「实时统计、逆序对计数、带权排名」这类场景。
分块:平衡实现难度与通用性
当操作类型混杂(比如既有区间求和,又有区间赋值),或你希望代码易懂、调试友好,分块是务实选择。把原数组每 √n 个元素划为一块,额外维护一个块和数组 sum[]。区间查询时:两端不完整块暴力扫,中间整块查 sum[],均摊复杂度 O(√n)。更新也只需改对应块和 + 原数组单点。它不要求数学直觉,适配性强,且常数小,在 n ≤ 10⁵ 时表现稳定。
线段树:真正自由的区间操作底座
线段树以递归分治建模区间,每个节点代表一个子区间,支持任意组合的区间操作——包括带 lazy 标记的区间加、区间赋值、区间最值、甚至合并多个信息(如最大连续和)。虽然空间开销为 O(4n),编码稍重,但它是唯一能统一处理「区间修改 + 区间查询」且保持 O(log n) 复杂度的标准方案。如果你的问题明确需要「对 [l, r] 全体加 k,再问 [x, y] 总和」,线段树就是最可靠的选择。
别忽略差分 + 树状数组的巧妙变体
树状数组本身不直接支持区间更新,但结合差分思想就能拓展能力。设原数组为 a,差分数组 d 满足 a[i] = d[1] + … + d[i]。那么「对 a[l..r] 加 k」就变成 d[l] += k、d[r+1] -= k 两次单点更新。此时用树状数组维护 d,就能用 query(i) 得到 a[i],用 query(r) − query(l−1) 得到区间和。若还需快速求 a 的区间和,就得维护两棵 BIT:一棵存 d[i],一棵存 i×d[i],靠数学变形还原 ∑a[i]。这属于进阶技巧,适合已有基础后优化性能。











