线段树Segment tree

递归划分下标区间,为每个区间维护聚合值。

核心约束
父区间的摘要由孩子区间合成。
适用问题
动态区间和、最值及可组合的区间聚合。
边界与取舍
懒标记需要更新操作与摘要相容,内存通常为 O(n)O(n)。

常见操作#

n 为数组长度;合并函数满足结合律且单次 O(1)O(1)。

操作时间复杂度条件与说明
从数组构建O(n)O(n)自底向上合并节点。
读取单点普通版 O(1)O(1);懒标记版 O(log⁡n)O(\log n)普通数组布局可直接读叶子;含未下推懒标记时须先沿路径下推,不能直接读取旧叶值。
单点更新O(log⁡n)O(\log n)更新到根路径上的聚合值。
区间聚合查询O(log⁡n)O(\log n)例如区间和、最小值;合并函数成本非 O(1)O(1) 时需相乘。
区间更新O(log⁡n)O(\log n)需要匹配操作的懒标记及可正确合并的作用函数;普通线段树不自动具有该保证。

时间与空间#

时间复杂度
常见单点更新 / 区间查询 O(log⁡n)O(\log n)
存储空间
O(n)O(n)

表示固定下标范围。动态开点、持久化和二维线段树有不同空间界。

基础原理参考资料

AtCoder Library · Segtree构建、单点更新、区间聚合的接口和代价。

AtCoder Library · Lazy Segtree支持区间作用所需的代数约束和复杂度。

13 个概念