作用:用于单点修改,以及动态前缀和统计。
进阶作用:差分树+状数组 -> 2个单点修改变区间修改,前缀和变单点访问。
瓶颈: 无法维护区间属性,只能使用线段树解决。
-
代码短,运行效率高,能用这个就不用线段树。
-
O logn 。
- 给某个位置上的数加上一个数。 单点修改。
- 可以转化为修改为任意值。Ologn
- 树状数组只能加上一个数,不能变成一个数(转化为加上他们的差值)。因为上层都要更新加上这个数。
- 快速求前缀和。 区间查询,区间修改(用差分)
- 普通前缀和不支持修改 ,若改 更新前缀和数组需要On。
- 树状数组可以单点修改+动态求前缀和。Ologn
- 前缀和:使用递归求.或者while x>0循环
- 给某个位置上的数加上一个数。 单点修改。
-
核心操作(3个)
-
-
核心函数
public int lowbit(int x){ //lowbit操作 返回最后一位1是多少。 return x&(-x); } //-------------------------------------- public void add(int x,int d){ // 在x位置上加上d的操作。也用于初始化。(单点修改)Ologn while(x<=n){ // x 下标必须小于N; c[x] +=d; x += lowbit(x); // 更新上一层。 } } //--------------------------------------- public int sum(int x){ //x位置前缀和。 (求前缀和)Ologn int res=0; while(x>0){ res+=c[x]; x -= lowbit(x);//更改区间 } return res; }//必背的三个操作。
-
-
扩展
- 加差分。可以实现 区间修改 单点访问
- 把原数组变为差分数组。2次add 就可以实现树状数组的区间修改。
- 原来的sum操作,直接变成单点访问。
- 加差分+2个树状数组,实现区间修改区间+前缀和。