樹狀陣列實現區間修改查詢

2022-05-16 01:03:52 字數 839 閱讀 7330

一般的樹狀陣列對於可減資訊可以實現單點修改+區間查詢,如果套用差分,可以實現區間修改+單點查詢。

設要維護的序列\(a\),差分陣列\(d_i = a_i - a_\)

要求\([1, x]\)區間的和:

\[\begin

query(x) &=

\sum_^x a_i \\&= \sum_^x \sum_^i d_i \\

&= \sum_^x (x-i+1)d_i

\end

\]維護乙個序列\(ds_i = (i-1)d_i\)

則和為\(x \sum_^x d_i - \sum_^xds_i\)

不要對這個壓行!雖然每行**都很短,但可能會出事!

很可能原來寫的intlong long就會忘改

ll d[len2], ds[len2];

int bitlen;

inline void modifyt(ll *t, int p, ll x)

inline ll queryt(ll *t, int p)

inline void modify(int p, ll x)

inline ll query(int p)

upd: 補乙個常數比較小,**很短的實現

struct dual_bit  t[n];

void modify(int p, int v)

ll prefix(int p)

};

打一些題很方便,比線段樹友好多了,常數也小

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

也許更好的閱讀體驗 好東西,以後可以不打線段樹了 本篇假定讀者都會最基礎的兩種樹狀陣列,即區改單查和單改區查 思考如何維護乙個區間的值,想到了差分 對乙個差分陣列做一次字首和可以得到每個位置的值 再對每個位置累加一下就是乙個區間的值 公式化的講,就是 設差分陣列為 c 則每個位置的值 val i s...

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

題面 首先,我們要推乙個柿子。displaystyle sum a i 把a i 用差分陣列表示出來,就可以寫成 displaystyle sum sum d i 我們考慮一下,每個d i 出現的次數是一定的。那我們可以換一下列舉順序,先列舉d i 在列舉他出現的次數,就可以變成 displayst...

樹狀陣列的區間修改 查詢

首先看樹狀陣列是用來求字首和比較方便的一種資料結構 sum i sigma a i sum bit x 而區間修改也不難實現 就是引入乙個差分陣列del del i 表示對i n的修改 這樣的話也就是最del i 求字首和 就能得到i n的所有修改了 因為i前的每乙個元素的修改都是對後面所有元素的修...