又称 Fenwick 树、二叉索引树(BIT)。支持维护前缀后缀的信息。

概述

树状数组将序列拆分成了恰好 nn 个区间,对于每一个前缀求解都可以拆成 logp\log p 个区间进行求解,而且自带一个卡不掉的 1/21/2 的常数,随机数据下则为 1/41/4 的常数!我们通过 lowbit\operatorname{lowbit} 来支持树状数组的工作。

一个显式的树状数组
一个显式的树状数组

模板,区间和我们可以用前缀和相减来求解,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <bits/stdc++.h>
using namespace std;
typedef long long i64;

int n, m;
int a[500005]; i64 C[500005];

void add(int x, int k) { for (; x <= n; x += x & -x) C[x] += k; }
i64 sum(int x) { i64 r = 0; for (; x; x -= x & -x) r += C[x]; return r; }

int main(void) {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i) scanf("%d", a + i), add(i, a[i]);
while (m--) {
int op, x, y; scanf("%d%d%d", &op, &x, &y);
if (op == 1) add(x, y);
else printf("%lld\n", sum(y) - sum(x - 1));
}
return 0;
}

Nothing built can last forever.
本站由 iznomia 使用 Stellar 1.30.4 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。