定义
满足以下功能的树状数组结构:
- 单点修改
- 区间查询 满足以下特征:
- 代码量小
- 维护的信息 & 运算满足:
- 结合律:$(x \circ y) \circ z = x \circ (y \circ z)$
- 可差分:运算具有逆运算,已知 $x \circ y$ 和 $y$ 可推 $x$。
用途
单点修改,区间查询
实现
结构
对于给定数据数组 $a[n]$ ,树状数组提供缓存数组 $c[n]$ 缓存区间信息。
$c[i]$ 的管辖区间应为 $[i + \mathrm{lowbit}(i) .. i]$,即: $$ c[i] = \mathrm{opt}{a[i - \mathrm{lowbit}(i) + 1 .. i]} $$
Lowbit
$\mathrm{lowbit}$ 运算是指一个数只保留在二进制下最低位的 1
,其余位为 0
所构成的二进制数。
根据二进制知识有:
|
|
区间查询结果根据缓存信息结合构成,因此要求结合律。
- TODO:由于线段树能够全包含且大于树状数组的适用范围,且 树状数组 相对 线段树 占优仅在于部分场景的时间复杂度常数系数,所以优先学线段树,树状数组有空再来看 🔽