資料結構 樹狀陣列

2021-08-29 01:15:33 字數 983 閱讀 4291

原陣列--->字首和------>範圍和

原陣列更改陣列元素在求和效率較低,引入樹狀陣列

假設原陣列a【】 樹狀陣列c【】

樹狀陣列 的三種操作:

1.lowbit() 子葉數(二進位制最低位的1代表多少)

**實現:

int lowbit(int n)

求:lowbit(x) returnx&(-x)

2.

update()// a[i]+k       假設a【i】是原陣列c[i]為樹狀陣列,改變a【i】個更新c[i]

update(i,k) ;

c[i]=c[i]+k;//首先更新從c【i】本身,然後更新它的父節點

i=i+lowbit(i);//更新c[i]的父節點

i<=n;//下一步 迴圈update()更新所有的父節點,直到滿足截止條件i<=n

**實現:

/*樹狀陣列支援單點操作,對某個數a【x】加上y,同時正確維護序列的字首和*/

void update(int x,int y)

3.sum()利用樹狀陣列求原陣列的字首和

sum(i);//表示從a一直加到a[i]

ans=c[i]+ans;

i=i-lowbit(i);//迴圈

i>0;//迴圈截止的條件

如:求區間【l~r】的和

sum(k)-sum(l-1);

**實現:

樹狀陣列支援查詢字首和,即序列a~x個數的和

int sum(int x)

資料結構 樹狀陣列

區間資訊的維護與查詢專題 樹狀陣列 1.問題 動態連續和查詢問題。給定乙個n個元素的陣列a1,a2,an,你的任務是設計乙個資料結構,支援以下兩種操作。add x,d 操作 讓ax增加d.query l,r 計算al al 1 ar.對普通陣列進行 一次修改或 特定區間 求和,時間複雜度為o n n...

資料結構 樹狀陣列

講到了線段樹,那就順便講講樹狀陣列吧。假設乙個長度為 12 的線段樹,構建結果如下 在區間求和問題上,在葉子節點,顯然劃線部分的值可以由父親節點 左端葉子節點得到。那麼,這部分資訊就是冗餘的,沒有儲存的必要。同理,可以推導出所有冗餘的部分如下 那麼,去除冗餘部分後的結果如下 給每乙個節點乙個編號。我...

資料結構 樹狀陣列

include using namespace std const int maxn 1e2 4 int c maxn 編號從1開始 intlowbit int n intupdate int x,int value intsum int x intmain include using namesp...