一般的樹狀陣列對於可減資訊可以實現單點修改+區間查詢,如果套用差分,可以實現區間修改+單點查詢。
設要維護的序列\(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\)
不要對這個壓行!雖然每行**都很短,但可能會出事!
很可能原來寫的int
改long 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前的每乙個元素的修改都是對後面所有元素的修...