功能
单点修改 O(log(n))
区间查询 O(log(n))
实现
前置知识点 lowbit()运算
lowbit(x)运算:得到x二进制下最低位的1
和剩余的0
所构成的数
例如:lowbit(10)
4的二进制可以表示为1010,则lowbit(10) = 2;
代码实现:
int lowbit(int x){
return x & -x;
}
树状数组实现原理
树状数组可以认为是前缀和数组的变形,是用树的结果来实现前缀和。
具体的构造方式如下图
- 1. 每个叶子节点t[x]是以当前点x向前延伸长度为lowbit(x)的前缀和
- 2. t[x]的父节点为t[x + lowbit(x)]
- 3.树的深度为logn + 1
功能实现
修改一个结点的值add(x, k)
void add(int x, int k){
for (int i = x; i <= n; i += lowbit(i))
t[i] += k;
}
查找前缀和
查找下标从1到x的这x个数的和
int query(int x){
int sum = 0;
for (int i = x; i; i -= lowbit(i)
sum += t[i];
return sum;
}