您的位置:首页 > 其它

树状数组的单点更新,区间查询。

2017-07-21 17:05 155 查看
基本的数组数组概念,树状数组利用其特殊的位置可以用二进制达到log级别的更新,如下图



核心代码

int sum(int i){
int s = 0;
while(i > 0){
s += dat[i];
i -= i&-i;
}
return s;
}
void add(int i,int x){
while(i <= n){
dat[i] += x;
i += i&-i;
}
}


这里有一个特殊的操作lowbit(x) = x&-x,通过这个操作我们就可以访问到上一层或则下一层,当我们需要去求前3项的和时,只需要向下执行i -= lowbit(i)的操作就行了,从图中你就会发现这正好就是前两项的和再加上第三个和,确实就是如此的巧妙,同理我们更新的时候就是不断向上去更新。因为这里就利用了二进制的巧妙,比如当我们在2的乘法的位置的数就刚好就是前面全部的和然后它再减去它的lowbit就是0,因为他只有最高位是1,而非2的乘方的位置,他会一直向下去寻找,知道找到第一个乘方的位置,加起来就刚好是前n项的和。希望你能明白。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: