int bit[maxn];//别忘了初始化为0
//在bit数组中需要加上x的地方加上x,使得用sum函数查询的时候显示出[i~maxn)区间内所有的元素都加上x
void add(int i,int x){
while(i<=n){
bit[i]+=x;
i += (i & -i);
}
}
//利用bit数组的特性求[1~i]这些位置上的数的和
int sum(int i){
int s=0;
while(i>0){
s += bit[i];
i -= (i & -i);
}
return s;
}
//二维上的二维数组和此相似
int bit[maxn][maxn];
int lowbit(int i){
return i & -i;
}
void add(int x,int y,int v){
for(int i=x;i<=n;i+=lowbit(i))
for(int j=y;j<=n;j+=lowbit(j))
bit[i][j]+=v;
}
int sum(int x,int y){
int s=0;
for(int i=x;i>0;i-=lowbit(i))
for(int j=y;j>0;j-=lowbit(j))
s += bit[i][j];
return s;
}
树状数组的实现
最新推荐文章于 2024-07-06 01:07:44 发布