树状数组
推导:
已知一个数为
设其二进制表示为:
其中有
所以
我们已知以下条件:
表示 二进制表示的最后一位
表示 二进制表示的倒数第二位,以此类推
所以对于以上区间中的任意区间
所以
即
例子:
所以
根据前面的划分原则,
图解:
此为以每一个数为
基本操作:
1.add( p , v )
理论依据:
设节点
由
由
所以,
此定理可以推广至所有节点
通用代码:
1 | void add(int p,int v) |
2.sum( x )
理论依据:
已知 :
设节点
的二进制表示为
由
内容可知,在对点进行修改时,需要将所有位于其上的区间进行修改,即对其所有祖先进行修改 图 解
由
中的划分部分可知,将 推 导 的父节点的二进制表示为
所以,
的父节点为
此定理可以推广至所有节点
此定理的逆定理即可实现寻找点
由图可知,任意一个区间(即图中节点)都是其所有子节点的和(与根节点用红色线相连),找出节点
区间
通用代码:
1 | int sum(int x) |
- 标题: 树状数组
- 作者: firstlight
- 创建于 : 2023-08-16 17:42:00
- 更新于 : 2025-01-22 22:41:04
- 链接: https://blog.firstlightport.top/posts/shu-zhuang-shu-zu/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论