树状数组学习笔记(线性初始化)

树状数组(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)];
 } }
相关文章
相关标签/搜索