樹狀陣列學習筆記

2021-09-29 05:47:14 字數 1630 閱讀 5076

在學習完了線段樹後,聽說樹狀陣列能寫的題,線段樹都能做,所以一直沒有詳細的學習樹狀陣列;直到碰到了一道卡線段樹的題目,因為線段樹運用了很多遞迴,所以常數比較大,容易被卡;現在總結一下樹狀陣列;

1、樹狀陣列個人認為就是字首和演變而來的;

2、單點更新:當你要更新某個點的值時,你要從下面到上面依次更新過去;

區間查詢和單點查詢:樹狀陣列沒有區間查詢這個東西,都可以說是單點查詢,就跟差不多字首和,當你求區間[l.r]的和時,只要sum( r)-sum(l-1)就行;並且要從上到下依次相加,跟字首和差不多;

3、區間更新:這裡的區間更新,就跟差分陣列非常相似了,當你要求區間[l,r]都加上a時,差分陣列是l點加上a,r+1這個點減去a;樹狀陣列跟這一樣;也可以說是單點更新;

模板:1.單點更新+區間查詢;求和操作;

#include

#define ll long long

#define pa pair

#define lson k<<1

#define rson k<<1|1

//ios::sync_with_stdio(false);

using

namespace std;

const

int n=

500100

;const

int m=

200100

;const ll mod=

2e9+7;

int n,m,tr[n]

;int

lowbit

(int k)

void

add(

int p,

int q)

}int

sum(

int p)

return s;

}int

main()

for(

int i=

1;i<=m;i++

)return0;

}

2.區間更新+單點查詢;求和操作

#include

#define ll long long

#define pa pair

#define lson k<<1

#define rson k<<1|1

//ios::sync_with_stdio(false);

using

namespace std;

const

int n=

500100

;const

int m=

200100

;const ll mod=

2e9+7;

int n,m,tr[n]

;int

lowbit

(int k)

void

add(

int p,

int q)

}int

sum(

int p)

return s;

}int

main()

for(

int i=

1;i<=m;i++

)else

}return0;

}

學習筆記 樹狀陣列

以下 為樹狀陣列最常用的幾個操作 1.low bi t mathrm lowbit function lowbit x longint int64 begin exit x and x end 2.單點修改 procedure replace x,y int64 var i int64 begin ...

樹狀陣列學習筆記

樹狀陣列 binary index tree,bit 也是很多人心中最簡潔優美的資料結構之一。最簡單的樹狀陣列支援兩種操作,時間複雜度均為 當然,樹狀陣列能維護的不侷限於加法,支援的操作也不止這兩種,甚至有大佬能用樹狀陣列實現平衡樹,但這篇筆記不會深入討論 因為我也還不是很懂 回顧一下,我們說,我們...

樹狀陣列學習筆記

參考自 0.介紹 來自wikipedia 樹狀陣列,又稱二分索引樹 binary indexed tree,bit 用於高效計算數列的字首和.它可以以 的時間得到 並同樣以 對某項加乙個常數。1.資料結構定義 存放原始資料元素的陣列a i.e.int a 樹狀陣列 s i.e.int s 注意 原始...