樹狀陣列或者二叉索引樹也稱作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為了將兩個query合成乙個,我們換了一種query思路 將答案變換成乙個大的加乙個小的減兩個中等的,即val)
void update1(int p,int y,int
val)
int query2(int p,int
y)int query1(int p,int y1,int
y2)
於是我們便有了這樣的**
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 是第三行...