樹狀陣列(二叉索引樹)

2021-08-30 06:40:56 字數 2065 閱讀 9549

樹狀陣列的原理介紹可見劉汝佳《演算法競賽入門經典:訓練指南》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二叉索...