樹狀陣列總結

2021-07-15 19:33:05 字數 1352 閱讀 4525

注意樹狀陣列中最小的數為1,不能是0,當輸入資料最小值為0時,可全體加一

樹狀陣列初始化為0

一維單點更新、區間求和

maxb為所用最大數字,要初始化

int lowbit(int x) 

void add(int x,int val)

int getsum(int x)

int query(int l,int r)

例題:

poj 2299 ultra-quicksort

poj 3067 japan

poj 3416 crossing

此時記錄每個點與前面一點的增值,則查詢某 點值即為從頭到這個點的增值的累和,即由getsum()得到。

更新區間如下:

void update(int l,int r,int val)

二維需要用容斥原理得到待求的二維區間

inline

int lowbit(int x)

void add(int x,int y,int val)

int getsum(int x,int y)

int calc(int x1,int y1,int x2,int y2)

例題:poj1195 mobile phones

將一維區間更新、單點查詢改為二維,同樣記錄的是增值。如圖,更新黃色區域,用容斥原理,雙斜線處增加,單斜線處減少。

1處增加後,2、3兩處再減回去,到了4被減了兩遍,再加回來。

例題:poj 2155 matrix

例題:

poj 2352 stars

poj 2481 cows

poj 3067 japan

poj 3416 crossing

樹狀陣列總結

樹狀陣列的基本知識已經被各種大牛和菜鳥講到爛了,我就不多說了,下面給出基本操作的 假定原陣列為a 1.n 樹狀陣列b 1.n 考慮靈活性的需要,使用int a傳陣列。define lowbit x x x int sum int a,int x void update int a,int x,int...

樹狀陣列總結

樹狀陣列是對乙個陣列改變某個元素和求和比較實用的資料結構。兩中操作都是o logn 在解題過程中,我們有時需要維護乙個陣列的字首和s i a 1 a 2 a i 但是不難發現,如果我們修改了任意乙個a i s i s i 1 s n 都會發生變化。可以說,每次修改a i 後,調整字首和s在最壞情況下...

樹狀陣列總結

今天學習了一下樹狀陣列,做乙個簡單總結。樹狀陣列可分為兩種操作,1 修改單個點,統計區間和 一般為 向上修改 update1 向下統計 sum1 2 修改區間,統計單個點 一般為向下修改 update2 向上統計 sum2 主要模板如下 int c n int lowbit int x 用於確定區間...