零基索引的最大值线段树,区间采用左闭右开 [b, e) 约定,可通过修改 T、f、unit 定制为其他结合律运算;单次操作 O(log N)。
Description: Zero-indexed max-tree. Bounds are inclusive to the left and exclusive to the right. Can be changed by modifying T, f and unit. Time: O(\log N)
-
定义与接口(据实现)
- 结构体 Tree:
- typedef T = int;static constexpr T unit = INT_MIN;
- 结合函数 f(T a, T b) = max(a,b)(可替换为任意结合函数);
- 内部数组 s(长度 2n)与底层大小 n。
- 构造:Tree(int n = 0, T def = unit) 初始化两倍长度的底层存储为 def。
- update(pos, val):点更新 a[pos] = val,并自底向上维护父节点值。
- query(b, e):查询区间 [b, e) 的聚合结果(此处为最大值)。
- 结构体 Tree:
-
工作机制
- 点更新:将叶节点位置平移到数组上半部(pos += n),赋值后不断上跳 pos/=2,用 f 维护父节点:s[pos] = f(s[2pos], s[2pos+1])。
- 区间查询:[b+n, e+n) 双指针向上收缩:
- 若 b 为右子,则先合并 s[b] 到左结果 ra,b++;
- 若 e 为右边界,则先 —e 并将 s[e] 合并到右结果 rb;
- 循环结束后返回 f(ra, rb)。
-
可定制性
- 将 T、unit 与 f 改为所需的幺元与结合函数(如求和/最小值/按位运算等),即可得到相应线段树。
- 区间语义为左闭右开 [b, e),数组为 0 基索引。
-
复杂度
- update 与 query 均为 O(log N);空间 O(N)。