樹狀陣列區間修改

2022-06-03 10:06:12 字數 632 閱讀 5760

有時,我們要支援區間修改,區間查詢。

線段樹可以做到。

但是樹狀陣列更好寫。

1d的情況:

設\(b[i]=a[i]-a[i-1]\)

則\(a[i]=b[1]+...+b[i]\)

\(a[1]+...+a[l]=(b[1])+(b[1]+b[2])+....(b[1]+...+b[l])\)

\(a[1]+...+a[l]=l*b[1]+(l-1)*b[2]+......+b[l]=sum((l-i+1)*b[i])\)

如果我們維護\(b[i]\)的和,\((i-1)*b[i]\)的樹狀陣列\(c,d\),就能維護\(a\)的字首和,就能知道\(a\)的區間和。

這樣子看上去功能比線段樹少。

但是如果我們要維護區間乘積

線段樹打標記要永久化。需要預處理出一種長度標記的冪次才能正確更新答案。這樣子十分麻煩。

然而在區間乘法時,兩個樹狀陣列乘的值都是一定的,可以logn處理出來。

在區間查詢時,我們可以算出b2的逆元,b1的逆元*(x+1)次,這個都能在查詢後完成。

這樣子比線段樹更方便。

**:

void ad(int x,int y)

int q(int x)

樹狀陣列維護區間和和區間修改

可以用樹狀陣列在 n logn 內,雖然線段樹也能,但是樹狀陣列的 空間都要比它優越得多.首先我們可以用差分的方法使區間修改可以在log的複雜度完成,但重點在於區間和的查詢.我們知道,此時num i a 1 a 2 a i 可以利用樹狀陣列快速求出.而區間和則是 a 1 a 2 a i a 1 a ...

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

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

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

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