树状数组

1.

从二进制下可以看出到某一点的前缀和为idx不断去掉一个'1'形成的新索引下的区间和,获取最后一个'1'

int lowbit(int x)
{
    return x&(-x);
}

2.

查询[L,R]之间的和

sum(R)-sum(L-1)

单次查询次数=log2(10^5)=17

单次查询时间复杂度:O(logN)

int sum(int x)
{
    int res = 0;
    for (; x; x -= lowbit(x))
    {
        res += tree[x];
    }
    return x;
}

3.单点更新

void add(int x, int v)
{
    for (; x <= MaxVal; x += lowbit(x))
    {
        tree[x] += v;
    }
}

单次查询次数=log2(10^5)=17

单次查询时间复杂度:O(logN)

 

posted @ 2016-11-30 14:16  web之路  阅读(147)  评论(0编辑  收藏  举报