RMQ問題 ST table 實現

2021-09-02 20:15:34 字數 456 閱讀 6132

void rmq_init(int l, int r)

}}int st(int l, int r)

rmq_init()初始化,st查詢

rmq(range minimum/maximum query),即區間最值查詢,是指這樣乙個問題:對於長度為n的數列a,回答若干詢問rmq(a,i,j)(i,j<=n),返回數列a中下標在i,j之間的最小/大值。

以求最小值為例,設dp [ i, j ]表示[ i, i+2^j-1]這個區間內的最大值,那麼在詢問到[a,b]區間的最小值時答案就是min(dp[a,k], dp[b-2^k+1,k]),其中 k 是滿足2^k<=b-a+1(即長度)的最大的k,即k=[ln(b-a+1)/ln(2)]。

注釋: [a, a+(1<=a (=>  k<=[ln(b-a+1)/ln(2)] )(當且取等號時k最大)(k取到最大,能保證覆蓋待求最值的區間)

談談RMQ問題

沒用的話 好像好久沒更博了,無聊就講講演算法吧 主要找不到水題 認識rmq 要學習rmq,首先要知道rmq問題是什麼吧?rmq簡單來說就是求區間的最大值 最小值 什麼?沒懂!舉個栗子 1 2 9 10 15 38 9 這裡有 7 個數 隨便輸的 rmq就是用來查詢這些數中的最大值 最小值 但是是區間...

RMQ問題與LCA問題

一 區間最小 最大查詢 range minimum maximum query rmq 問題 toj 2762 描述 已知長度為l 的數列a 詢問區間 l,r 中的最值。若詢問的次數較少,可以用線性的複雜度來查詢,但如果詢問的次數過多且l 過大,那麼複雜度就會很高。所以需要更快速的查詢方法。st 演...

RMQ(線段樹實現)

t t第乙個線段樹程式,還沒a過題,不過也很感動,先貼出來 下標從0開始,輸入 1 1 結束.求每一段區間之間的最大值。include include typedef struct treenodenode int mymax int a,int b node buildtree int a,int...