树状数组

进阶

树状数组把前缀和拆成若干 lowbit 管辖区间。

树状数组

示例会同时展示原数组和 bit 数组,方便理解 lowbit 覆盖区间。

AlgoAnim · 树状数组

待机

速度
待机
// 源代码
1vector<int> bit;
2
3int lowbit(int x) {
4    return x & -x;
5}
6
7void add(int idx, int delta) {
8    for (int i = idx; i < (int)bit.size(); i += lowbit(i)) {
9        bit[i] += delta;
10    }
11}
12
13int query(int idx) {
14    int sum = 0;
15    for (int i = idx; i > 0; i -= lowbit(i)) {
16        sum += bit[i];
17    }
18    return sum;
19}

复杂度分析

时间 更新/查询 O(log n)
空间 O(n)
最优 O(log n)
最坏 O(log n)

算法讲解

树状数组的核心是 lowbit(x),它表示索引 x 在二进制中最低位的 1 所对应的贡献范围。

通过不断跳转 x += lowbit(x) 或 x -= lowbit(x),我们能在 O(log n) 内完成更新和前缀查询。

它代码短、常数小,是竞赛中处理动态前缀和、逆序对、离散化统计的高频工具。

和线段树相比,它更轻量,但功能也更偏向可加性前缀信息。