您的位置:首页 > 其它

树状数组的模板

2017-08-09 21:23 204 查看
//树状数组的模板;
int lowbit(int i){
return i&(-i);
}//lowbit(i)=2^k(其中k为i在二进制下末尾0的个数)

//下面的代码给原数组的下标为pos的位置上的元素a[pos]加上一个数num;

void  update(int pos,int num){
while(pos<=n){//n为元素的个数
c[pos]=c[pos]+num;
pos+=lowbit(pos);
}
}

//计算原数组A[1]到a[x]的和;
int sum(int x){
int sum=0;
while(x>0){
sum+=c[x];
x-=lowbit[x];
}
return sum;
}
//二维树状数组
//作用:用于快速求数字的子矩阵的和;
void uodate (int i,int j,int k){//给a[i][j]加上k
while(i<=n){
int temp=j;
while(temp<=n){
c[i][temp]+=k;
temp+=lowbit(temp);
}
i+=lowbit(i);
}
}
int sum(int i,int j){//查询a[1][1]到a[i][j]的和
int sum=0;
while(i>0){
int temp=j;
while(temp>0){
sum+=c[i][temp];
temp-=lowbit(temp);
}
i-=lowbit(i);
}
return sum;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: