树状数组
树状数组,也称为二进制索引树,是一种支持单点更新
和区间查询
的数据结构。在大多数情况下,我们可以用它来查询区间和、区间乘积或其他满足以下条件的操作:
- 结合律:
- 具有逆运算,我们可以通过
和 推断出
它基于这样一个假设:任何前缀
从上图可以看出,每个位置
int lowbit(int x) {
return x & (-x);
}
// 单点更新
void updateFT(int[] ft, int index, int val) {
int diff = val - ft[index];
while(index <= ft.length - 1) {
ft[index] += diff;
index += lowbit(index);
}
}
void createFT(int[] arr) {
int n = arr.length;
int[] ft = new int[n + 1];
for(int i=1;i<=n;i++) {
updateFT(ft, i, arr[i-1]);
}
}
void getSum(int[] ft, int end) {
int ret = 0;
while(end > 0) {
ret += ft[end];
end -= lowbit(end);
}
return ret;
}