ST表 學習筆記

2021-08-30 02:40:34 字數 3431 閱讀 3430

概念

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

21​len

的區間,從右端點向左一段不超過區間長,但大於12l

en

\fraclen

21​len

的區間,發現都過了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個數字。根據動態規劃的定義,把這個區間分割成...