跳转至

树状数组倍增

对应线段树二分,树状数组也有自己对应的树上对数级查找算法。这种算法利用了树状数组独特的性质,被称作树状数组倍增。

如何倍增?

我们都知道,树状数组下标为 i 的位置存储着 (i-\operatorname{lowbit}(i),i] 的信息。

int query(int x){
    int res(0);
    for(; x; x -= x & -x)
        res += tr[x];
    return res;
}

考虑以上过程。以 100101001010 为例,它的贡献是这样计算的:

T(1001010010\textbf10)+T(10010100\textbf{1}000)+T(10010\textbf1000000)+T(100\textbf100000000)+T(100000000000)

换句话讲,就是逐次去除最低位。

考虑反向计算贡献,即逐次添加最高位。这样的过程实际上就是倍增。

例题选做

联合省选2020 AB 冰火战士
ZJOI2013 K大数查询
CTSC2018 混合果汁

评论