标签:
别人实在讲得很清楚了,参考自 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