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

树状数组(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)];
    }
}

 

posted @ 2019-03-16 18:26  TLE自动机  阅读(1137)  评论(1编辑  收藏  举报