st表的優勢在於可以把查詢乙個區間的最值的時間複雜度降為o(n
)o(n)
o(n)
。假設有乙個陣列裡有10000個元素,第i個元素記為ar[i]。
我們用f[i][j]表示從第i個元素開始,向右i+2j-1的 這些元素的最大值。
有f[i][j]=max(f[i][j-1],f[i+2j-1][j-1])
這其實是把區間[i][j]分成了兩個部分,每部分的長度均為2j-1,將兩個部分的最大值儲存在f[i][j]中。有了這個狀態轉移方程後,就可以求出所有的f陣列了。不難看出,時間複雜度為o(n
logn
)o(nlogn)
o(nlog
n)。
for
(j =
1; j <= lg[n]
; j++
)}
這裡的思想非常巧妙。設查詢的區間為[l][r]
則查詢區間的長度為len=r-l+1
查詢結果為max(f[l][log
(len
)log(len)
log(le
n)],f[r-2len+1][log
(len
)log(len)
log(le
n)]通過兩次分別向左,向右的查詢,可以巧妙的覆蓋整個查詢區間。由於log
loglo
g經常需要呼叫,需要預處理一下。
l g[
i]=l
g[i/
2]+1
lg[i]=lg[i/2]+1
lg[i]=
lg[i
/2]+
1用**實現的話,就是
while
(q--
)
這樣,通過預處理o(n
logn
)o(nlogn)
o(nlog
n)後,每次查詢的時間複雜度僅為o(1
)o(1)
o(1)
。是不是很快呢?
ST表 學習筆記
概念 st表是用來求解區間最大值的一種優秀的離線演算法,它可以 o n logn o nlogn o nlog n 預處理,然後o 1 查詢,如何實現呢?思想運用了近似於區間dp的方法,乙個大區間有小區間轉移得到,不同的是,我們定義st i k st i k st i k 表示從第i ii個位置起,...
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表
st 表是用於解決可重複貢獻問題的資料結構 可重複貢獻問題 是指對於運算 opt 滿足 x opt x x 則對應的區間詢問就是乙個可重複貢獻問題。摘自oi wiki 說人話,就是對區間的重複運算不影響結果。比如區間最值問題 rmq 區間gcd 比方10個數求最大值,先對前7個數求最值,再對後6個數...