【算法】树状数组

树状数组

求和

\(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;
}

原文链接: https://www.cnblogs.com/streamazure/p/12903092.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    【算法】树状数组

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/349156

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午5:32
下一篇 2023年3月2日 上午5:32

相关推荐