樹狀陣列的三種模式

2021-08-07 07:02:30 字數 1135 閱讀 8876

我們在這之前已經了解過了lowbit的概念,還有對於樹狀陣列的基本的認識了,然後,再學習樹狀陣列的基礎用法。

樹狀陣列主要有三種型別,從簡單到複雜。 依次是修改點,求區間和 ,修改區間求點,還有最複雜的修改區間,求區間。

最簡單的第一種模型:

int lowbit(int x)

void add(int x,int v) //更新函式 }

int sum(int x) //求和函式

return summ;

}int query(int i,int j) // 查詢函式

第二種模型,修改區間求點:

修改n次區間,讓我求某乙個點現在是多大了。

假設剛開始的時候所有的元素全部都是0,然後我們進行n次的區間修改,我們在這裡引進乙個陣列b,在這裡陣列b的概念很重要:b[x]=a代表的是1-x之間的每乙個元素都增加了a。我們個實際的例子:

我們給區間1-5增加了5那麼b[5]=5,給1-7,增加了10,那麼b[7]=10,我們i=4這個點現在是多大? 好,我們再回頭看看當時對b陣列的定義:b[x]=a代表的是1-x之間的每乙個元素都增加了a ,那麼我們求 i=4這個點的時候,只要求b[4]+b[5]+b[6]+++++b[maxn]; 所以這個例子,結果就是 b[4]+b[5]+b[6]+++++b[maxn]=0+5+0+10+0+0++++0=15;

我們在用的時候要把b寫成樹狀陣列,也就是在b[5]=5,的時候要向下更新add(5,5),同理,b[7]=10,向下更新,add(7,10);  在求i=4的時候,向上求和,sum(4);

#includeusing namespace std;

const int maxn=1000;

int b[maxn];

int l,r;

int lowbit(int x)

void add(int x,int v)

int query(int x)

int main()

int sum_b(int *a,int x)

return s;

}

特別好的別人的一篇blog

詳解樹狀陣列三種模型

首先說明下 最後的最大值模型的 沒有測試,不過應該是沒問題的。其它三個更新求和的模型的 借鑑於網上的各個博文,應該是沒問題的。其中前兩個模型的 已測試無誤。樹狀陣列與線段樹在思想上很類似的一種資料結構,它比線段樹更簡潔,但它的適用範圍也小了些。提供一篇博文,詳解樹狀陣列的 樹狀陣列是乙個可以高效的進...

樹狀陣列區間求和三種模型

樹狀陣列在區間求和問題上有大用,其三種複雜度都比線段樹要低很多 有關區間求和的問題主要有以下三個模型 以下設a 1.n 為乙個長為n的序列,初始值為全0 1 改點求段 型,即對於序列a有以下操作 修改操作 將a x 的值加上c 求和操作 求此時a l.r 的和。這是最容易的模型,不需要任何輔助陣列。...

樹狀陣列區間求和三種模型

樹狀陣列在區間求和問題上有大用,其三種複雜度都比線段樹要低很多 有關區間求和的問題主要有以下三個模型 以下設a 1.n 為乙個長為n的序列,初始值為全0 1 改點求段 型,即對於序列a有以下操作 修改操作 將a x 的值加上c 求和操作 求此時a l.r 的和。這是最容易的模型,不需要任何輔助陣列。...