支持单点修改与前缀和查询的高效二进制对数结构
树状数组(Fenwick Tree)是一种通过二进制位运算设计的高效数据结构。它巧妙地利用二进制数的特性,将一个大小为 $N$ 的数组组织成森林或树状形态,使得区间前缀和查询与单点修改均能在 $O(\log N)$ 时间内完成。
lowbit树状数组的核心支柱是 lowbit 操作。lowbit(x) 表示整型变量 $x$ 在二进制下最低位 1 所代表的数值:
lowbit(x) = x & (-x)
i + lowbit(i).i - lowbit(i).#define MAXN 100005
int c[MAXN], n;
// 1. lowbit: 获取最低位的 1 所代表的数值
inline int lowbit(int x) {
return x & (-x);
}
// 2. 单点修改:原数组 A[i] 增加 delta,自底向上维护区间和 C
void update(int i, int delta) {
for (; i <= n; i += lowbit(i)) {
c[i] += delta;
}
}
// 3. 前缀和查询:求和 A[1..i],自顶向下合并区间
int query(int i) {
int sum = 0;
for (; i > 0; i -= lowbit(i)) {
sum += c[i];
}
return sum;
}
// 4. 区间和查询:求和 A[l..r],利用差分性质完成计算
int rangeQuery(int l, int r) {
return query(r) - query(l - 1);
}