RMQ之ST表維護區間極值

2021-08-04 15:23:30 字數 340 閱讀 1722

令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中...