树状数组的单点更新,区间查询。
2017-07-21 17:05
155 查看
基本的数组数组概念,树状数组利用其特殊的位置可以用二进制达到log级别的更新,如下图
核心代码
这里有一个特殊的操作lowbit(x) = x&-x,通过这个操作我们就可以访问到上一层或则下一层,当我们需要去求前3项的和时,只需要向下执行i -= lowbit(i)的操作就行了,从图中你就会发现这正好就是前两项的和再加上第三个和,确实就是如此的巧妙,同理我们更新的时候就是不断向上去更新。因为这里就利用了二进制的巧妙,比如当我们在2的乘法的位置的数就刚好就是前面全部的和然后它再减去它的lowbit就是0,因为他只有最高位是1,而非2的乘方的位置,他会一直向下去寻找,知道找到第一个乘方的位置,加起来就刚好是前n项的和。希望你能明白。
核心代码
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项的和。希望你能明白。
相关文章推荐
- HDOJ-1556(线段树||树状数组,区间更新+点查询)
- hdu1556-树状数组 一维 区间更新 单点查询
- poj2155-二维树状数组 区间更新 单点查询
- Matrix (POJ - 2155 )(树状数组的区间更新-点查询)
- Light oj 1080 - Binary Simulation(树状数组区间更新点查询)
- POJ 2892 Tunnel Warfare || HDU 1540(树状数组+二分 || 线段树的单点更新+区间查询)
- hdu4267 A Simple Problem with Integers(树状数组区间更新点查询)
- hdu 2642二维树状数组 单点更新区间查询 模板题
- poj 2155 二维树状数组/区间更新单点查询
- 2017.8.23-------树状数组---区间更新+区间查询
- hdu1556 color the ball 树状数组区间更新单点查询(附线段树做法)与二维扩展
- hdu2642二维树状数组单点更新+区间查询
- Light oj 1080 - Binary Simulation(树状数组区间更新点查询)
- hdu 2642二维树状数组 单点更新区间查询 模板题
- 树状数组:HDU1556 Color the ball 【区间更新,单点查询]
- hdu2642二维树状数组单点更新+区间查询
- HDU 1556 Color the ball (一维树状数组,区间更新,单点查询)
- POJ 1195 - Mobile phones 二维树状数组(单点更新..区间查询)
- hdu2642二维树状数组单点更新+区间查询
- (树状数组)hdu1556 Color the ball(区间更新,单点查询)