令d[i][j]表示從i開始,長度為2^j的一段元素中的最小值,用遞推方式計算,d[i][j]=min(d[i][j-1],d[i+2^j-1,j-1),就是將[i,i+2^j]的這段區間一分為二,然後取兩段區間的極值就可以了。
2^j小於等於n,所以一般來講陣列第二維開30就夠了。
至於遞推的計算順序,j總是與前一項j-1有關,所以對j的迴圈放在外層,就不會破壞計算順序。
查詢操作就是,令k為滿足2^k<=r-l+1的最大整數,則以l,r開頭和結尾的兩個長度為2^k的區間合併覆蓋了l和r的區間
**的下標從0開始
void rmq_init(){
for(int i=0;i
筆記 RMQ區間極值問題
專題 區間最小 最大查詢 range minimum maximum query rmq問題 描述 已知長度為l的數列a,詢問區間 l,r 中的最值。若詢問的次數較少,可以用線性的複雜度來查詢,但如果詢問的次數過多且l過大,那麼複雜度就會很高。所以需要更快速的查詢方法。st演算法 預處理o nlog...
ST表(RMQ問題 區間最值查詢
3 2 4 5 6 8 1 2 9 7 預處理,用dp解決。設a i 是要求區間最值的數列,dp i,j 表示從第i個數起連續2 j個數中的最大值。dp 1,0 表示第1個數起,長度為2 0 1的最大值,其實就是3這個數。dp 1,2 5,dp 1,3 8,dp 2,0 2,dp 2,1 4 可以看...
RMQ演算法 ST表
題目大意就是給你兩個長度為n的序列讓你找到乙個盡可能大的下標p使得1 p之間的任意兩個區間l r都滿足rmq u,l,r 相等其實就是最小下標相同 rmq range minimum maximum query 問題是指 對於長度為n的數列a,回答若干詢問rmq a,i,j i,j n 返回數列a中...