树状数组
实现两个功能:
(1)求某数组中某一个前缀和
(2)对某个位置上的数加上某个数
注意:
原数组下标必须从1开始
相关阅读
由原数组s求树状数组tree
对树状数组tree:
(1)当原数组下标为奇数时,s[ i ] = tree[ i ]
(2)tree[i] = (i - lowbit(i), i]区间和
lowbit运算
lowbit(x) = x & -x = 2 ^ k;
k 等于 x 在二进制下末尾零的个数
树状数组求前缀和
int query(int index){
int res = 0;
for(int i = index; i > 0; i -= index)
res += tree[i];
return res;
}
对某个位置上的数加上某个数
void add(int index, int v){
for(int i = index; i <= N; i += index)
tree[i] += v;
//N为树状数组的大小
}
树状数组的初始化
先将tree定义一个全为零的数组,可以视为这是一个全为0的树状数组,然后我们只需要执行对某个位置上的数加上某个数的操作即可
例如:
for(int i = 1; i <= n; i++) cin >> s[i];
for(int i = 1; i <= n; i++) add(i, s[i]);