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...