樹狀陣列的原理介紹可見劉汝佳《演算法競賽入門經典:訓練指南》194頁,講的非常好
簡單自己對樹狀陣列的基本理解:我們原先不是把陣列看成一排嗎,但現在不是了,我們用乙個類似二叉樹的結構來儲存資料,存到c當中去,好好研究劉汝佳所畫的圖。
下面說明基本應用
對於乙個n元素的陣列a[n],可執行如下操作:
add(i, d):讓a[i]變成a[i]+d。
query(l, r):返回a[l]+a[l+1]+…+a[r]。
注意:樹狀陣列只能計算a[1]開始的和,a[0]這個元素是不能用的。
**模板:
//樹狀陣列只能計算a[1]開始的和,a[0]這個元素是不能用的。
#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
typedef long long ll;
const int maxn=50000+5;//最大元素個數
int n;//元素個數
int c[maxn];//c[i]==a[i]+a[i-1]+...+a[i-lowbit(i)+1]
//返回i的二進位制最右邊1的值
int lowbit(int i)
//返回a[1]+...a[i]的和
ll sum(int x)
return sum;}
//令a[i] += val
void add(int x, ll val)
}int main()
return 0;
}
二維樹狀陣列
//乙個n*n的矩陣,矩陣裡的每乙個數要麼是0,要麼是1。
//有兩種操作,c操作是將區間[(x1,y1),(x2,y2)]中所有的數反轉(0變1,1變0),q操作是查詢f[x][y]的數值
#include#include#include#include#include#include#define n 1040
#define ll long long
using namespace std;
int n;
int bit[n][n];
int sum(int i,int j) ///查詢單點的值
i-=i&-i;
}return s;}
void add(int i,int j,int x)
i+=i&-i;
}} int main()
else {
scanf("%d%d",&x,&y);
cout《經典例題:
hdu 1166 敵兵布陣(模板題)
lightoj 1112 - curious robin hood (樹狀陣列:單點修改 + 區間查詢)
下面三個題要一起看:
uva1428 ping pong(樹狀陣列+思維)
北京化工大學2023年10月程式設計競賽 問題 d: 積木 樹狀陣列(這題解決上乙個題的乙個問題:資料量大,離散化)
tyvj1432 樓蘭圖騰 樹狀陣列逆序對
poj 2481 cows (樹狀陣列:區間真子集的個數,有點區間逆序對的意味)
hdu 1394 minimum inversion number (樹狀陣列:求逆序對))
牛客練習賽38 部分題解 d出題人的手環 (陣列陣列求逆序對,這題更好)
poj 2352 stars(樹狀陣列)思維
hdu-4000 fruit ninja 樹狀陣列+思維
poj 2828 buy tickets(樹狀陣列:統計1的個數或線段樹:查詢並更新從左到右第i個1)
poj2182 lost cows 樹狀陣列 二分+思維
樹狀陣列優化dp
hdoj5542-the battle of chibi【樹狀陣列優化dp】(推薦,詳細介紹)
cf597c. subsequences [dp樹狀陣列優化]
hdu3450counting sequences dp+樹狀陣列
二叉索引樹(樹狀陣列)
二叉索引樹 binary indexed tree,bit 動態連續和查詢問題,給定乙個n個元素的陣列a1,a 2,an。支援以下兩種操作 1.add x,d 操作 讓a x增加d。2.query l,r 計算al a l 1 ar。在學習二叉索引樹之前,需要先介紹lowbit.對於正整數x,我們定...
二叉索引樹(樹狀陣列)
二叉索引樹 binary indexed tree 又叫樹狀陣列,主要是用於解決動態連續和查詢問題。給定乙個n個元素的陣列a1,a2,an,你的任務是設計乙個資料結構,支援以下兩種操作。對於正整數x,我們 定義lowbit x 為想的二進位制表示式中最右邊所對應的值。比如由38288的二進位制是10...
BIT二叉索引樹(樹狀陣列)
powered by phantom lsh將上面的求連續和問題稍微改進一下,現在需要支援一種新的操作 add x d 即把a x 增加d。這樣一來,如果通過字首和的方式計算就不能簡化計算了,因為每次修改乙個元素都要修改所有在它後面的字首和。有什麼解決辦法呢?我們需要用一種新的資料結構 bit二叉索...