樹狀陣列高階

2022-02-14 15:24:19 字數 708 閱讀 1655

csdn同步

前置知識:

下面我們考慮區間修改。

一開始我們維護的是部分字首和,但是現在,區間修改顯然不能用字首和有關的做法。

單區間修改用差分就夠了。但是這裡有修改,考慮將差分樹狀陣列結合。

令 \(c\) 為 \(a\) 的差分,維護 \(a\) 的區間修改與區間和即可,這樣 \(a\) 就是 \(c\) 的字首和了。

那麼區間修改只需要改 \(2\) 個點,單點詢問只需要問字首和。但是區間詢問則怎麼做?

顯然,還是用字首和相減,考慮字首和。

那麼考慮乙個東西:

\[\sum_^n a_i

\]\[= \sum_^n \sum_^i c_j

\]\[= \sum_^n c_j (n-i+1)

\]\[= n \times \sum_^n c_j - \sum_^n c_i (i-1)

\]顯然,前面一部分我們已經得到維護,後面我們維護 \(c_i (i-1)\) 即可,開兩個樹狀陣列維護。

const int n=1e5+1;

int c[n],b[n];

struct bit

inline int sum(int x)

inline void update(int x,int k)

} t;

高階版樹狀陣列

我們都知道樹狀陣列一般有兩種形式 1.最為傳統的版本,支援區間求和,單點修改 2.差分樹狀陣列 支援區間修改,單點查詢 而高階版樹狀陣列 可支援 區間求和,區間修改 其原理是 設tree i a i a i 1 差分 那麼容易得到 tree 1 tree 2 tree i a i 這個公式 維護tr...

樹狀陣列 演算法高階專題

lowbit i i i 或者i i i i 1 9 and 1 1 要點 乙個數i對應二進位制表示未尾0的個數為k,那麼他管轄的範圍為 從i到左邊i 2 k 1的2 k 個元素。如 i 6 110 k 1 6管轄的範圍為 c 5 a 5 a 6 2 1 管2個。2 求前n個元素的和,n的二進位制的...

「高階」資料結構 樹狀陣列!

最簡單的樹狀陣列就是這樣的 void add int p,int x int ask int p int range ask int l,int r 通過 差分 就是記錄陣列中每個元素與前乙個元素的差 可以把這個問題轉化為問題1。設原陣列為a i 設陣列d i a i a i 1 a 0 0 則 a...