數學原理:
利用上面的性質,在樹狀陣列的尾部插入資料,來建立乙個樹狀陣列
void
push
(int pos)
}
void
update
(int pos,
int v)
int pre = c[pos]
; pos+
=lowbit
(pos)
;//父親的位置
/* 更新父親 */
while
(pos <= n)
//沒有更新父親
else
break;}
}
設 query(x,y)query(x,y) 求區間 [x,y] 之間的最值, 已知 c[x] 表示 [x−lowbit(x)+1,x] 之間的最值,那如何求區間 [x,y] 的最值呢?
我們不難發現:
所以,我們發現下面的規律,因為 y−lowbit(y)+1y−lowbit(y)+1 表示 c[y]c[y] 結點所管轄範圍的最左邊的點若
int
query
(int x,
int y)
else
}return res;
}
特點:
所以,樹狀陣列求區間最值特別適合那些:一邊在尾部新增資料,一邊查詢的題目
const
int maxn =
1e6+
5, maxe =
1e6+5;
//點與邊的數量
int n, m;
int n = maxn;
int a[maxn]
, c[maxn]
;// a是原陣列
inline
intlowbit
(int x)
inline
intfa
(int p)
inline
intleft
(int p)
inline
intg
(int a,
int b)
void
update_by_child
(int p,
int v)
void
update
(int p,
int v)
}int
query
(int l,
int r)
return ret;
}
思路:利用樹狀陣列求區間最值
//點與邊的數量
int n, m;
int n = maxn;
int a[maxn]
, c[maxn]
;// a是原陣列
inline
intlowbit
(int x)
inline
intfa
(int p)
inline
intleft
(int p)
inline
intg
(int a,
int b)
void
update_by_child
(int p,
int v)
void
update
(int p,
int v)
}int
query
(int l,
int r)
return ret;
}int
main()
char s[10]
;for
(int i =
1; i <= m;
++i)
else}}
return0;
}
樹狀陣列維護區間最值
題目描述 給你乙個1 n的排列和乙個棧,入棧順序給定 你要在不打亂入棧順序的情況下,對陣列進行從大到小排序 當無法完全排序時,請輸出字典序最大的出棧序列 輸入描述 第一行乙個數n 第二行n個數,表示入棧的順序,用空格隔開,結尾無空格 輸出描述 輸出一行n個數表示答案,用空格隔開,結尾無空格 示例1輸...
樹狀陣列求區間最值
樹狀陣列 binary index tree 利用二進位制的一些性質巧妙的劃分區間,是一種程式設計,時間和空間上都十分理想的求區間和的演算法,同樣我們可以利用樹狀陣列優美的區間劃分方法來求乙個序列的最值 約定以 num 表示原陣列,以 idx 表示索引陣列,lowbit x x x 樹狀陣列求和時通...
樹狀陣列求區間最值
樹狀陣列 binary index tree 利用二進位制的一些性質巧妙的劃分區間,是一種程式設計,時間和空間上都十分理想的求區間和的演算法,同樣我們可以利用樹狀陣列優美的區間劃分方法來求乙個序列的最值 約定以 num 表示原陣列,以 idx 表示索引陣列,lowbit x x x 樹狀陣列求和時通...