区间查询->前缀和->树结构维护(log_2(n))
(x-lowbit(x)+1) ->若无子结点是自身,若有子结点是最底层第一个子结点
单点修改、区间查询:t[x]初始化为add(x,a[x])返回的和,只修改t[x]不修改a[x]
+lowbit(x) -> 父结点,上一层的(连续)前缀和
-lowbit(x) ->上一层的(不连续)前缀和
-lowbit(x)+1 -> 若无子结点是自身,若有子结点是最底层第一个子结点
ask():每次抹尾部最后一个1,直到0位置【不包含0位置】
add():每次在尾部最后一个1上再+1,直到根结点为止
![]()
区间修改、单点查询: t[x]初始化为0,维护时t[x]存储add(x,a[x])返回的前后增量和
区间修改、区间查询
b[x]的前缀和 -> a[x]的增量
b[1~x]前缀和的和 -> a[x]前缀和的增量
树状数组的扩展应用
树状数组拓展到二维:
模板题代码:
DataStructure/树状数组.md at main · RanFeng2/DataStructure · GitHub
参考: