树状数组

【模板】

单点修改。时间复杂度 O(logn)

 

void add(int pos, int w)
{
    while (pos <= n)
    {
        tree[pos] += w;
        pos += lowbit(pos);
    }
}

区间查询。时间复杂度 O(logn)

返回的是从1到pos的值的和。

int query(int pos)
{
    int res(0);
    while (pos > 0)
    {
        res += tree[pos];
        pos -= lowbit(pos);
    }
    return res;
}

  

lowbit。表示x的二进制表达式中最低位的1所对应的值

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

  

关于区间修改。其实就是用将以差分的形式构建树状数组,例如将 [x, y] += w时,设d[ ]为差分数组,那么就

            add(x, k);
            add(y + 1, -k);

同理差分下的单点查询就是query(x)。这是因为将1~x的差分全部加起来,就是x这个数本身。

posted @ 2023-07-26 15:34  zhuxiaopi  阅读(11)  评论(0)    收藏  举报