差分樹狀陣列

2021-09-13 19:18:16 字數 1177 閱讀 4697

假設現在有乙個原陣列a(假設a[0] = 0),有乙個陣列d,d[i] = a[i] - a[i-1],那麼

a[i] = d[1] + d[2] + … + d[i]

d陣列就是差分陣列

所以求a[i]就可以用樹狀陣列維護d[i]的字首和

即維護的是d[i]的樹狀陣列

上面的數學思想可以實現區間修改,以及單點查詢。

下附上**:

區間修改(1~n)

void

change

(int x,

int k)

單點查詢
void

change

(int x,

int k)

intgetsum

(int x)

///得出的就是區間點的值

根據上面的差分陣列的定義可以得到:

a[1] + a[2] + a[3] + … + a[k] = d[1] + d[1] + d[2] + d[1] + d[2] + d[3] + … + d[1] +

d[2] + d[3] + … + d[k] = σ(k - i + 1) * d[i] (i從1到k)

變化一下 σa[i] (i從1到k) = σ(k+1) * d[i] - i * d[i] (i從1到k)

d[i]可以用乙個字首和維護,i * d[i]也可以用乙個字首和進行維護,所以區間修

改,區間查詢就變得很方便了

假設c1維護d[i]的字首和,c2維護d[i] * i的字首和

區間查詢及區間修改

#include

using

namespace std;

intlowbit

(int x)

intgetsum

(int x)

return ans1 - ans2;

}void

add(

int x,

int v)

基本照搬其文,不過現在時間一晚,不便修改,在此結篇。

題目:習題:木樁塗塗看

所以樹狀陣列可分為兩類,一類是差分陣列,另一類是字首和陣列

4.24更新此博。貼上的區間查詢修改樹狀陣列貌似不能區間賦值,只能區間加減。

差分 差分陣列 樹狀差分

原陣列 ai94 759差分陣列 bi9 5 3 24差分陣列的字首和94 759顯然通過求字首和可以做到單點查詢 他高效的地方在於區間修改,比如我們對區間 2,4 每個元素加上5,我們只需在差分陣列 b2 5,b5 5,然後求字首和即可 原陣列 ai94 759差分陣列 bi 903 2 1 差分...

樹狀陣列與差分

1.什麼是樹狀陣列?顧名思義,就是用陣列來模擬樹形結構唄。那麼衍生出乙個問題,為什麼不直接建樹?答案是沒必要,因為樹狀陣列能處理的問題就沒必要建樹。和trie樹的構造方式有類似之處。2.樹狀陣列可以解決什麼問題 可以解決大部分基於區間上的更新以及求和問題。3.樹狀陣列和線段樹的區別在 樹狀陣列可以解...

差分詳解 樹狀陣列擴充套件

前言 現在還不是很懂,不過先把模板抄在這裡把。介紹一下差分,乙個很簡單的東西。一 簡介 已知陣列a為1,2,1,5,7,4 那麼差分陣列1,1,1,4,2,3 顯然,差分陣列就是當前項與前一項的差值。容易得到,an就是差分陣列的前n項和。二 那麼有什麼便利的地方呢?我們假想一下,現在要給1至4的區間...