解决问题:
在O(logn)的时间复杂度下,完成1.单点修改(快速的给某一个位置的数加上一个数)。
2.区间查询(求某一个前缀和)。
三个基本函数
int lowbit(int x)
{
return x & -x; //返回这个数后面有几个0,有几个0他就是第几层。
}
void add(int x, int c)
{
for(int i = x; i <= n; i += lowbit(i)
{
tr[i] += c;
}
}
int query(int x)
{
int res = 0;
for(int i = x; i; i -= lowbit(i))
{
res += tr[i];
}
return res;
}
扩展
1.利用差分,将两大性质改为,区间修改,单点查询。
把原数组更改为差分数组,那么,单点修改,就相当于区间修改,区间查询,就相当于单点查询。
2.性质改为 区间查询 + 区间修改
求前缀和 只要能求出前i个数的和,就能求出一个区间和,所以前i个数a1 + … + ax
就相当于把每个ai换成差分a1 = b1,a2 = b1 + b2,…,ax = b1 +…+bx;
维护两个前缀和.
一个维护bi, 一个维护bi * i;
(b是差分);