【數據結構】樹狀數組
阿新 • • 發佈:2018-11-27
管控 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都是序號
也有種二分法的思想在裏面,很難理解
【數據結構】樹狀數組