樹狀陣列及二維樹狀陣列

2022-08-05 01:48:13 字數 1849 閱讀 3238

樹狀陣列或者二叉索引樹也稱作binary indexed tree,又叫做fenwick樹;它的查詢和修改的時間複雜度都是log(n),空間複雜度則為o(n),這是因為樹狀陣列通過將線性結構轉化成樹狀結構,從而進行跳躍式掃瞄。通常使用在高效的計算數列的字首和,區間和。

什麼要用樹狀陣列

線段樹比樹狀陣列功能更強大,適用範圍更廣,但為什麼我們要寫樹狀陣列呢?我們其實看中的是樹狀陣列,常數小且寫起來快捷的特點

我們來看一下這一張圖,右側的每一數字都代表以該點為下標的樹狀陣列陣列(下文將稱為sum陣列)我們首先選取sum[16]作為觀察物件,那麼sum[16]就是前面16個數的和(觀察黑色橫線長度) 那麼sum[4]發生變化時,他的直系父節點sum[4]也要跟著變化,同理sum[16]也要一起變化

二維樹狀陣列

我們來看hdu 2642這道題 那麼我們略一繪畫,便是這樣

相信大家都知道二維差分的做法,但此題是動態的,要在過程中去維護 這時候我就產生了一種思路,就是橫向做樹狀陣列,但樹狀陣列的每乙個結點都是一棵樹狀陣列於是 我就寫出了這樣的**

相信大家都知道二維差分的做法,但此題是動態的,要在過程中去維護 這時候我就產生了一種思路,就是橫向做樹狀陣列,但樹狀陣列的每乙個結點都是一棵樹狀陣列於是 我就寫出了這樣的**

void update2(int p,int y,int

val)

void update1(int p,int y,int

val)

int query2(int p,int

y)int query1(int p,int y1,int

y2)

為了將兩個query合成乙個,我們換了一種query思路 將答案變換成乙個大的加乙個小的減兩個中等的,即

於是我們便有了這樣的**

void update(int p,int y,int

val)

int query(int p,int

y)

總體**如下:

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int n=1010

;int n=1000

,m,sum[n][n],book[n][n],tx1,tx2,ty1,ty2;

char a[10

];int lowbit(int x)

void update(int p,int y,int

val)

int query(int p,int

y)int

main()

else

if(a[0]=='d'

)

else

}return0;

}/*5b 581 145

b 581 145

q 0 600 0 200

d 581 145

q 0 600 0 200

*/

樹狀陣列及二維樹狀陣列

一直以為樹狀陣列能用線段樹水過去,直到我今天碰上了樹狀陣列模板題。然後就是開始認真的學習樹狀陣列,突然發現怎麼這麼好寫qwqqqq。部分 一.樹狀陣列 樹狀陣列是一種資料結構,核心思想是利用二進位制的補碼思想。首先就是樹狀陣列的結構圖 然後我們對他進行變形 是不是感覺更好理解了呢?然後我們對其進行標...

樹狀陣列 二維樹狀陣列模板

樹狀陣列模板 int lowbit int x int add int x,int val int que int x 模板題 題解 include include include using namespace std int c 300000 rank 300000 int n int lowb...

樹狀陣列 二維

首先初始陣列還是a陣列,二維的 搞乙個b陣列,也是二維,b i 就是a陣列第i行的一維樹狀陣列 b 2 1 a 2 1 b 2 2 a 2 1 a 2 2 b 2 3 a 2 3 最後我們來搞乙個c陣列,當然它還是二維的hhh c 1 就是第一行的樹狀陣列,c 2 是第一行加第二行,c 3 是第三行...