码迷,mamicode.com
首页 > 编程语言 > 详细

树状数组

时间:2016-08-23 11:27:19      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:

别人实在讲得很清楚了,参考自 http://blog.csdn.net/ljd4305/article/details/10101535

再说一些,树状数组本质还是单点更新区间求和

更新的时候可以看这个例子   0101 -> 0110 -> 1000 结合更新函数和树状数组那个图应该很好理解,其实就是从当前节点一直向父节点更新

至于求和的时候也是一样假设求1~i的和,i的二进制表示从低位到高位第一个不为零的为第k+1位,那么就加上c[k],表示将原a[]数组的i~i-2^k+1个数全加了,然后对比函数接下来自然从i-2^k再开始加,重复上述操作直至为零,附带模版

更新

void plus(int pos , int num) 
{ 
    while(pos <= n) 
    { 
          in[pos] += num; 
          pos += Lowbit(pos); 
    } 
} 

求和

int Sum(int end) 
{ 
    int sum = 0; 
    while(end > 0) 
    { 
        sum += in[end]; 
        end -= Lowbit(end); 
    } 
    return sum; 
}

顺便推荐树状数组一些运用  http://www.cnblogs.com/wenruo/p/5787418.html   

 

树状数组

标签:

原文地址:http://www.cnblogs.com/shimu/p/5798481.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!