//树状数组的模板;
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;
}
树状数组的模板
最新推荐文章于 2025-05-25 19:04:27 发布