我們在這之前已經了解過了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 的和。這是最容易的模型,不需要任何輔助陣列。...