树状数组适合单个元素经常修改而且还反复要求部分的区间的和的情况。
树状数组的所有题线段树都可以写,但相对而言编程效率和程序运行效率更加高
C[]只是一个求和工具 ,每个C[i]最后一个元素都是A[i] , C[i] 中有lowbit[i]个元素,所以C[i] 就是 A[i-lowbit[i]+1]~A[i] 的和
C[]的计算:C[k] = sum(k) – sum(k-lowbit(k))
A[k]的更新:对于所有k之后的lowbit[k]的倍数的元素都要更新
sum[k]的计算:对于所有k之前的lowbit[k]的倍数的元素都要加上
代码如下:
void Modify(int p,int val)
{
while(p<=nNode)
{
C[p]+=val;
p+=lowbit[p];
}
}
int QuarySum(int p)
{
int sum=0;
while(p>0)
{
sum+=C[p];
p-=lowbit[p];
}
return sum;
}