树状数组(Binary Indexed Trees)其代码简洁,第一次碰见就被惊艳到了。数组
网上讲解也有不少,我就简单总结一下。spa
树状数组有以下几个基本操做。code
首先要了解lowbit运算,二进制分解下最小的2的次幂。blog
#define lowbit(x) (x&(-x))
1.查询前缀和it
int ask(int x) { int res = 0; for (; x; x -= lowbit(x)) res += b[x]; return res; }
2.单点增长class
void add(int x, int v) { for (; x <= n; x += lowbit(x)) b[x] += v; }
void init(){//线性构造 for (int i = 1; i <= n; i++){ pre[i] = pre[i - 1] + a[i]; c[i] = pre[i] - pre[i - lowbit(i)]; } }