概念
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]也就是每個位置上的原數了,然後再一層一層的向上貢獻,至此實現方法已經有了
實現
我們外層列舉2//預處理
inline
void
pre(
)
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個數字。根據動態規劃的定義,把這個區間分割成...