树状数组

来源:互联网 发布:c语言算法教程 编辑:程序博客网 时间:2024/06/07 07:19


树状数组是一种修改和求和都为O(logn)的数据结构

     c[i]表示 A[i-2^k+1]到 A[i]的和。  2^k=i&(i^(i-1))  

当我们修改 A[i]的值时,C[i]往跟节点一路上溯   

 

   int lowbit(int k)              //下标从1开始

{

return i&(i^(i-1));

}

void insert(int k,int d,int max)

 {

    while(k<=max)                                                        插入A[k]的值 d  

  { 

       C[i]+=d;

      k+=lowbit(k);

 }

}

int getsum(int pos)

{

  int t=0;

while(pos>0)

{   

  t+=C[pos];

 pos-=lowbit(pos);

}

return t;

}