一维树状数组
快速求区间和, 功能和线段树相似, 查询和更新的时间复杂度都为o(log(n)).
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1000002;
ll sum[maxn*2];
ll value[maxn];
int n;
inline int lowbit(int x) {
return x & -x;
}
void update(int idx, int v) {
while (idx <= n) {
sum[idx] += v;
idx += lowbit(idx);
}
}
ll query(int x) {
ll ans = 0;
while(x > 0) {
ans += sum[x];
x -= lowbit(x);
}
return ans;
}
二维树状数组
快速求区间和, 查询和更新的时间复杂度都为o(n^2).
#include <iostream>
#include <cstdio>
#include <cstring>
#include <alogorithm>
using namespace std;
typedef long long ll;
const int maxn = 100005;
ll sum[maxn*2][maxn*2];
int value[maxn][maxn];
int nx, ny;
inline int lowbit(int x){
return -x&x;
}
void update(int x, int y, int v){
for(int i = x; i <= nx; i += lowbit(i))
for(int j = y; j <= ny; j += lowbit(j))
sum[i][j] += v;
}
ll query(int x, int y){
ll ans = 0;
for(int i = x; i >= 0; i -= lowbit(i))
for(int j = y; j >= 0; j -= lowbit(i))
ans += sum[i][j];
return ans;
}