功能
动态区间求和。在区间中的每个元素都可能会发生改变的情况下进行区间求和
复杂度
区间求和 O(logn)
单点更新 O(logn)
操作
用tree代表树状数组,a代表一般数组,tree[x]表示a[x-t]到a[x]的所有a的和,t为x在二进制表示下第一个1代表的值。
1.额外操作,计算lowbit。
lowbit是树状数组中各级连接的纽带,通过lowbit可以把tree联系起来
int lowbit(int x) //计算lowbit
{
return x&(-x);
}
2.单点更新操作。如果a中第i个点加上了k,则在tree中包含有i这个点的所有tree都将会加上k。
void updata(int i,int k) //更新树状数组,第i个数加上k O(logn)
{
while(i<=n){
tree[i]+=k;
i+=lowbit(i);
}
}
3.区间求和操作。可以求算出[1,i]区间所有元素的和。即a[i]+a[2]+…+a[i]
int getsum(int i) //计算[1,i]区间和 O(logn)
{
int sum=0;
while(i>0){
sum+=tree[i];
i-=lowbit(i);
}
return sum;
}
总结
树状数组是一个维护区间和的结构,目的是为了能快速的解决动态区间的求和问题
这里动态区间的含义是区间里的数的大小会改变