概念
st表是用來求解區間最大值的一種優秀的離線演算法,它可以 o(n
logn
)o(nlogn)
o(nlog
n)預處理,,然後o(1)查詢,如何實現呢?
思想運用了近似於區間dp的方法,乙個大區間有小區間轉移得到,不同的是,我們定義st[
i][k
]st[i][k]
st[i][
k]表示從第i
ii個位置起,2
k2^k
2k個數的最大值,咋轉移呢?發現我們只處理2
k2^k
2k所以2
k2^k
2k可以拆成兩個沒有相交的長度為2k−
12^
2k−1
的區間分別是st[
i][k
−1
]st[i][k-1]
st[i][
k−1]
和s t[
i+2k
−1][
i−1]
st[i+2^][i-1]
st[i+2
k−1]
[i−1
],也就是說我們需要先預處理這兩個小區間的值,而這兩個小區間需要更小的區間來更新,所以到底層就是st[
i][0
]st[i][0]
st[i][
0]也就是每個位置上的原數了,然後再一層一層的向上貢獻,至此實現方法已經有了
實現
//預處理
inline
void
pre(
)
我們外層列舉2
k2^k
2k,內層迴圈每個位置,然後每次拆成上面兩個式子的max就好了
//詢問
inline
intque
(int l,
int r)
發現詢問區間有兩種情況
1.
1.1.
是2
k2^k
2k,那麼直接對區間長取個log
2(r−
l+1)
log_2()
log2(
r−l+
1)然後輸出st[
l]lo
g]
st[l]log]
st[l]l
og]就行了
2.
2.2.
不是2
k2^k
2k,那麼不難發現,他可以拆成兩個2
k n2^k2k n的區間的並,也就是說從區間左端點向右一段不超過區間長,但大於12l en \fraclen 21len 的區間,從右端點向左一段不超過區間長,但大於12l en \fraclen 21len 的區間,發現都過了1 2\frac 21所以肯定會有交集,也肯定將 整個區間覆蓋全了,然後直接對這兩部分取max就好 然後我們發現,len是2 k2^k 2k就會分成兩個完全覆蓋區間的相同的區間,所以就可以合併這兩種情況了,輸出上面**裡的式子就好了 思路定義st[ i][k ][j] [e ]st[i][k][j][e] st[i][ k][j ][e] 表示從位置(i, k) (i,k) (i,k )向右2 j2^j 2j,向下2 e2^e 2e這個矩形的最大值,然後轉移的話模擬一下一維,分成4個小矩形就好了,只不過分的方式不同,具體看**吧 實現//預處理
inline
void
pre(
)return
;}自己意會一下分割方式,腦補一下過程
//查詢
inline
intque
(int x,
int y,
int l,
int r)
這也是個神奇的過程,繼續腦補
t [i
][j]
[k
]st[i][j][k]
st[i][
j][k
]表示以(i,
j)
(i,j)
(i,j
)為起點2
k2^k
2k為邊長的正方形的最大值,詢問需要費點時間,可以被乙個寬度極小的矩形卡死,看實際情況吧
//by acermo
#include
#include
#include
#include
#include
using
namespace std;
const
int m=
100500
;int n,m,e,f[m][20
];inline
void
read
(int
&x)inline
void
write
(int x)
inline
void
pre(
)inline
intque
(int l,
int r)
signed
main()
return0;
}
//by acermo
#include
#include
#include
#include
#include
using
namespace std;
const
int m=
305;
int n,m,q;
int f[m]
[m][10]
[10];
inline
void
read
(int
&x)inline
void
write
(int x)
inline
void
pre(
)return;}
inline
intque
(int x,
int y,
int l,
int r)
signed
main()
return0;
}
ST表學習筆記
st表是一種利用dp思想求解最值的倍增演算法 st表常用於解決rmq問題,即求解區間最值問題 接下來以求最大值為例分步講解一下st表的建立過程 1.定義 f i j 表示 i,i 2j 1 這個長度為2j的區間中的最大值 2.預處理 f i 0 a i 即區間 i,i 的最大值就是a i 3.狀態轉...
演算法筆記 st表
概述 用倍增法求區間最值的離線演算法,o nlogn 預處理,o 1 訪問。預處理 狀態 st i j i,i 2 j 之間的最值 狀態轉移 如果j等於0,st i j a i 如果j大於0,st i j max st i j 1 st i 2 j 1 j 1 或st i j min st i j ...
st表複習筆記
st表,一種高效的區間最值查詢 rmq 演算法。本質其實是乙個動態規劃。其實吧,對於看過線性dp的人來說應該不難理解,只是處理有些麻煩。但是本土狗因為 1的問題居然改了許久.用兩個2 i的區間把整個區段覆蓋,dp i j 表示區間最值,從i開始,向前2 j個數字。根據動態規劃的定義,把這個區間分割成...