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