文章目录
- 一、基本概念
- 二、核心操作
- 三、常见应用
一、基本概念
树状数组用于动态维护一段区间,操作的时间复杂度为 O ( l o g n ) O(logn) O(logn)
定义: t [ i ] = [ i − l o w b i t ( i ) + 1 , i ] t[i] = [i - lowbit(i) + 1, i] t[i]=[i−lowbit(i)+1,i] 区间和
二、核心操作
树状数组下标建议从 1 1 1 开始
单点修改:给 a [ x ] + v a[x] + v a[x]+v
void add(int x, int v) { for(int i = x; i <= n; i += lowbit(i)) t[i] += v; }
区间查询:求 [ 1 , x ] [1, x] [1,x] 区间和
int query(int x) { int res = 0; for(int i = x; i; i -= lowbit(i)) res += t[i]; return res; }
lowbit
int lowbit(int x) { return x & -x; }
三、常见应用
树状数组维护差分,可以实现动态的区间修改和单点查询
区间修改:给 [ l , r ] [l, r] [l,r] 区间每个数加上 c c c
add(l, c); add(r + 1, -c);
单点查询:求 a [ x ] a[x] a[x]
query(x)