2013-team4/code/bitree
从 Trac 迁移的文章
这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。
原文章内容如下:
{{{
一维树状数组
}}}
{{{
创建
BITree t;
清空
t.clear();
将第 k 个数增加 d
t.add(k, d);
查询 0 <= i <= k 的 sum(a[i])
t.sum(k);
}}}
{{{
const int MAXN = 20005, OFFSET = 3;
typedef int DATA;
struct BITree{
DATA a[MAXN];
void clear(){
memset(a, 0, sizeof(a));
}
int lowbit(int i){
return (i & -i);
}
DATA sum(int i){
DATA ret = 0;
for(i += OFFSET; i > 0; i -= lowbit(i))
ret += a[i];
return ret;
}
void add(int i, DATA d){
for(i += OFFSET; i < MAXN; i += lowbit(i))
a[i] += d;
}
};
}}}
{{{
二维树状数组
}}}
{{{
将第 (x, y) 个数增加 d
t.add(x, y, d);
查询 (0, 0) 到 (x, y) 的 sum
t.sum(x, y);
查询 (x1, y1) 到 (x2, y2) 的 sum
t.sum(x1, y1, x2, y2);
}}}
{{{
typedef int DATA;
const int MAXX = 105, MAXY = 105, OFFSET = 3;
struct BITree{
DATA a[MAXX][MAXY];
void clear(){
memset(a, 0, sizeof(a));
}
int lowbit(int i){
return (i & -i);
}
DATA sum(int x, int y){
DATA ret = 0;
for(int i = x + OFFSET; i > 0; i -= lowbit(i))
for(int j = y + OFFSET; j > 0; j -= lowbit(j))
ret += a[i][j];
return ret;
}
DATA sum(int x1, int y1, int x2, int y2){
DATA ret = sum(x2, y2);
ret -= sum(x1 - 1, y2) + sum(x2, y1 - 1);
ret += sum(x1 - 1, y1 - 1);
return ret;
}
void add(int x, int y, DATA d){
for(int i = x + OFFSET; i < MAXX; i += lowbit(i))
for(int j = y + OFFSET; j < MAXY; j += lowbit(j))
a[i][j] += d;
}
};
}}}
一维树状数组
创建
BITree t;
清空
t.clear();
将第 k 个数增加 d
t.add(k, d);
查询 0 <= i <= k 的 sum(a[i])
t.sum(k);
const int MAXN = 20005, OFFSET = 3;
typedef int DATA;
struct BITree{
DATA a[MAXN];
void clear(){
memset(a, 0, sizeof(a));
}
int lowbit(int i){
return (i & -i);
}
DATA sum(int i){
DATA ret = 0;
for(i += OFFSET; i > 0; i -= lowbit(i))
ret += a[i];
return ret;
}
void add(int i, DATA d){
for(i += OFFSET; i < MAXN; i += lowbit(i))
a[i] += d;
}
};
二维树状数组
将第 (x, y) 个数增加 d
t.add(x, y, d);
查询 (0, 0) 到 (x, y) 的 sum
t.sum(x, y);
查询 (x1, y1) 到 (x2, y2) 的 sum
t.sum(x1, y1, x2, y2);
typedef int DATA;
const int MAXX = 105, MAXY = 105, OFFSET = 3;
struct BITree{
DATA a[MAXX][MAXY];
void clear(){
memset(a, 0, sizeof(a));
}
int lowbit(int i){
return (i & -i);
}
DATA sum(int x, int y){
DATA ret = 0;
for(int i = x + OFFSET; i > 0; i -= lowbit(i))
for(int j = y + OFFSET; j > 0; j -= lowbit(j))
ret += a[i][j];
return ret;
}
DATA sum(int x1, int y1, int x2, int y2){
DATA ret = sum(x2, y2);
ret -= sum(x1 - 1, y2) + sum(x2, y1 - 1);
ret += sum(x1 - 1, y1 - 1);
return ret;
}
void add(int x, int y, DATA d){
for(int i = x + OFFSET; i < MAXX; i += lowbit(i))
for(int j = y + OFFSET; j < MAXY; j += lowbit(j))
a[i][j] += d;
}
};