其實之前在k大數查詢中就已經用到了,只是一直沒有說明
所以今天就來補個欠賬。
感覺單點修改、區間查詢和區間修改、單點查詢沒什麼必要講,這裡就只講區間修改、區間查詢(其實也不難)。
設原陣列第\(i\)位的值為\(a_i\),\(d_i=a_i-a_\),則有(這裡認為\(a_0=0\)):
\[a_x=\sum_^x d_i
\]所以有:
\[\sum_^x a_i= \sum_^x \sum_^i d_j =\sum_^x(x-i+1)d_i
\]於是我們得到了:
\[\sum_^x a_i=(x+1)\sum_^x d_i-\sum_^x d_i \times i
\]於是我們把原陣列差分後維護兩個樹狀陣列,乙個維護\(d_i\),乙個維護\(d_i \times i\)。
這樣區間求和時可以在兩個樹狀陣列中查詢得到字首和,區間修改時就是差分陣列的修改,每次修改兩個點即可。
具體**如下:
void add(int x,int y)//給差分陣列中的位置x加上y
long long sum(int x)
其中\(c\)維護的是\(d_i\),\(c\)維護的是\(d_i\times i\)。
比線段樹好寫多了是不?
線段樹的單點修改加區間修改
const int maxn 1e6 5 int a maxn 存每個數的值 struct node tree maxn 4 void pushup int id 區間合併 void pushdown 區間下放,進行區間修改的時候用到 void build int id,int ll,int rr ...
樹狀陣列 區間修改,區間查詢
也許更好的閱讀體驗 好東西,以後可以不打線段樹了 本篇假定讀者都會最基礎的兩種樹狀陣列,即區改單查和單改區查 思考如何維護乙個區間的值,想到了差分 對乙個差分陣列做一次字首和可以得到每個位置的值 再對每個位置累加一下就是乙個區間的值 公式化的講,就是 設差分陣列為 c 則每個位置的值 val i s...
樹狀陣列區間修改區間查詢
題面 首先,我們要推乙個柿子。displaystyle sum a i 把a i 用差分陣列表示出來,就可以寫成 displaystyle sum sum d i 我們考慮一下,每個d i 出現的次數是一定的。那我們可以換一下列舉順序,先列舉d i 在列舉他出現的次數,就可以變成 displayst...