算法树状数组

Posted streamazure

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法树状数组相关的知识,希望对你有一定的参考价值。

树状数组

求和

(C[i])表示数组(A)中的一段连续和,具体是哪一段,由下式确定:

(C[i]=A[i-2^k+1]+A[i-2^k+2]+...+A[i])

其中(k)(i)的二进制数中从最低位到最高位连续零的长度,如对于(8(1000))(k=3)

(SUM[i])表示数组(A)的前(i)项和,计算式:(SUM[i]=C[i]+C[i-2^{k}]+C[i-2^{k}-2^{k}]+...)

其中(2^{k}=i&(-i)) ,记作lowbit.

更新

(A[i])更新时,受影响的有(C[i+2^k]、C[i+2^k+2^k].....)

模板

int n;
int a[1005],c[1005]; //原数组和树状数组

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

void updata(int i,int p){    //在i位置加上p
    while(i <= n){
        c[i] += p;//更新受影响的C[i]
        i += lowbit(i);
    }
}

int getsum(int i){        //求区间1到i的和
    int res = 0;
    while(i > 0){
        res += c[i];
        i -= lowbit(i);
    }
    return res;
}

以上是关于算法树状数组的主要内容,如果未能解决你的问题,请参考以下文章

树状数组求逆序对

算法笔记 - 树状数组 (Fenwick tree)

如何在原数组的基础上生成树状数组

算法模板之树状数组

神犇求解…树状数组能求区间最值吗?时间复杂度是多少啊?…还有就是树状数组在求解啥问题上更有优势?

算法基础-树状数组