1. 程式人生 > >【數據結構】樹狀數組

【數據結構】樹狀數組

管控 pan 補碼 div 操作 都是 所有 數據結構 int

樹狀數組

ta的本質是利用二進制的性質維護一組數據

最常用的操作就是求前綴和

int lowbit(int x){
    return x&(-x);
    /*通過補碼,清空高位1,只留下最後一個1*/
}

void add(int x,int val){
    while(x<=n){
        c[x]+=val;
        x+=lowbit(x);
    }
    /*更新時,需要去把該節點所被管轄的結點全部更新
        你比如說1101->1110
        所被管轄的結點 1110->10000
        被管轄的結點,是利用二進制來求的
        最低位1管轄著所有後面的0
    
*/ }
void sum(int r){
    int sum=0;
    while(r>0){
        sum+=c[r];
        c-=lowbit(r);
    }
    return sum;
    /*跟更新結點是一樣的,只不過是逆序操作
        比如1101->1000 1100 1101 的和
    */
}

二進制的求和視角

S110=S100【S010(A001+A010)+S100(A011+A100)】+S110(A101+A110)

也就是說只能有100 和 010 管控

只有一個1的時候才能管控剩余的0,或者說是最低位的1?,前面的1都是序號

也有種二分法的思想在裏面,很難理解

【數據結構】樹狀數組