樹狀陣列區間修改加區間查詢

2022-05-21 12:57:12 字數 645 閱讀 3029

其實之前在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...