參照大佬部落格:
rmq(range minimum/maximum query), 是一種問題,即 查詢給定區間的最大值或最小值。
st演算法的思想是將乙個區間平均分成兩個子區間,分別查詢兩個子區間的最值,再求這兩個最值的最值。因此是dp的思想。
f[i,j] 代表以con[i]為區間左值,長度為 2^j 的區間的最大(小)值。
初始化:
dp初始狀態為
for(int i = 0; i < n; i++)f[i,
0] = con[i]; // 此時的最值是他本身
狀態轉移方程為
void rmq(int num) //預處理->o(nlogn)}
注意只有長度為2^(j - 1)的區間最值查詢出來後,才可以查詢長度為 2^j 的區間,因此**中兩個for迴圈的位置不可交換。
查詢為
rmq(a, i, j)=max。
為什麼第二個子區間是從j減,因為允許分成的兩個子區間有重疊的部分(解決了有的區間不能分成兩個互不重疊的 長度為 2^j 的區間的問題 )。
LCA問題的RMQ解法解析
lca問題是指最近公共祖先問題,rmq問題是只區間最小值問題,我們可以將lca問題轉化為rmq問題,然後利用rmq的解法來解決lca問題。有關rmq問題的詳解可以參考我的部落格,有關於rmq問題的詳解。本部落格重點講如何將lca問題轉化為rmq問題。當我們深度遍歷樹時,我們沒遇到乙個未訪問過的節點就...
RMQ 區間最值查詢 入門
講解不錯 一些細節講解 rmq range minimum maximum query 即區間最值查詢。rmq演算法一般用較長時間做預處理,時間複雜度為o nlogn 然後可以在o 1 的時間內處理每次查詢。主要是來解決 給你乙個陣列 其中有n個數字,現在給你多次詢問,給你區間 l,r 問你在這個區...
約束rmq 1RMQ(約束RMQ)
1rmq其實是rmq的乙個特殊情況,它的特殊性體現在 序列中每兩個相鄰元素的差是1或 1。即 對於這種特殊情況,有一種方法可以將rmq的時間降至常數級別,即用 的時間解決。可以發現,如果lca用dfs rmq的方法解決,則rmq部分正好是 1rmq。所以,如果會了這種方法,將可以用 這裡簡單 因為我...