树状数组(Binary Indexed Trees)其代码简洁,第一次遇见就被惊艳到了。
网上讲解也有很多,我就简单总结一下。
树状数组有如下几个基本操作。
首先要了解lowbit运算,二进制分解下最小的2的次幂。
#define lowbit(x) (x&(-x))
1.查询前缀和
int ask(int x) { int res = 0; for (; x; x -= lowbit(x)) res += b[x]; return res; }
2.单点增加
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)]; } }
原文:https://www.cnblogs.com/xiaoguapi/p/10543631.html