Home 树状数组
Post
Cancel

树状数组

1. 模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    int n;
    vector<int> tree;

    int lowbit(int x) {
        return x & -x;
    }
    
    int query(int x) {
        int ans = 0;
        for(int i = x; i > 0; i -= lowbit(i))
            ans += tree[i];
        return ans;
    }

    void update(int x, int u) {
        for(int i = x; i <= n; i += lowbit(i))
            tree[i] += u;
    }

2. 初始化

1
2
3
    // BIT从1开始, 需要整体往右偏移
    n = nums.size();
    tree.resize(n + 1, 0);

3. 单点更新 + 区间更新

1
2
3
4
5
    // 单点更新
    update(idx + 1, val)

    // 区间更新

4. 单点查询 + 区间查询

1
2
3
4
5
6
    // 单点查询
    ans = query(idx + 1);

    // 区间查询
    // 前缀和 sum[l, r] = presum[r] - presum[l - 1]
    ans = query(right + 1) - query(left);
This post is licensed under CC BY 4.0 by the author.

Segement Tree

珂朵莉树