0
点赞
收藏
分享

微信扫一扫

树状数组


树状数组的组成结构:

树状数组_数组

树上结点C和A数组的关系:

树状数组_结点_02

C结点管辖的区域是

树状数组_结点_03

,其中k是结点下标二进制末尾0的个数

计算

树状数组_数组_04


int lowbit(int a){
return a&(a^(a-1)); //return a&(-a);
}


则对于一颗子树,父节点和子节点的区域关系:

树状数组_结点_05

. 于是有了这样的更新函数:

int update(int i,int x){
while(i<=n){
//x更新C[i] 如C[i]=C[i]+x;
i=i+lowbit(i);
}
}


求数组A前k项和:


如:


树状数组_tree_06

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



例题:


hdu 2838


hdu 2689



举报

相关推荐

0 条评论