树状数组

作用

有一个数组a,下标从0到n-1,现在给你w次修改,q次查询,修改的话是修改数组中某一个元素的值;查询的话是查询数组中任意一个区间的和,w + q < 500000。


计算 LowBit

int lowbit(x) 
{   
    return x & -x;
}

c数组的表示了,c[i]表示从第i个元素向前数lowbit(i)个元素,这一段的和,这就是上面说的区间和,只不过这个区间是靠右端点的;


后缀和的长度是2的幂;
上一层后缀和的长度是下一层后缀和长度的两倍;
下一层后缀和只要补上自己后缀和的长度就可以得到上面层的后缀和(图中的虚框框),注意,是上面的后缀和,而不是上一层的后缀和,这个性质就是更新操作的依据;
最后一位1右边有多少个0(可以用log2(lowbit(x))log2(lowbit(x))表示)就表示这一层有多少个直系子层(子层的意思就是这一层的和包含下面某一层的和)。

posted @ 2018-03-23 21:43  WenOI  阅读(94)  评论(0编辑  收藏  举报
水波背景