注意樹狀陣列中最小的數為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 用於確定區間...