树状数组

别人实在讲得很清楚了,参考自 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 add(int k , int num) 
{ 
    while(k <= n) 
    { 
          tree[k] += num; 
          k += k&(-k); 
    } 
} 

求和

int Sum(int k) 
{ 
    int sum = 0; 
    while(k > 0) 
    { 
        sum += tree[k]; 
        k -= k&(-k); 
    } 
    return sum; 
}

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

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