再談RMQ演算法

2021-07-04 02:31:08 字數 792 閱讀 9897

大家知道rmq演算法就是求乙個區間裡的任意區間的最大值和最小值的高效演算法,因為只需要乙個預處理就可以在o(1)的時間裡算出任意區間的最值。所以當遇到在乙個區間裡求最值之差不超過某乙個數的最長子區間問題就可以利用該方法,當然還需要用到二分演算法。舉個例子:在8,4,2,4,3,2,4,5,2,6這個序列中求出最大值與最小值之差小於3的最長子序列。顯然是4,2,4,3,2,4,這個序列。那麼我們怎樣用程式去實現呢?很簡單,先利用rmq打錶出整個區間的最值(最大值與最小值),那麼我們會發現從乙個固定的點開始往後的最大值與最小值之差是不遞減序列,所以可以利用二分查詢,找出該起點開始最值之差小於3的第乙個點,然後列舉每個起點更新最值就可以求出答案了!

#include #include #include #include using namespace std;

#define max(a,b) (a)>(b)?(a):(b)

#define min(a,b) (a)<(b)?(a):(b)

int max[10000][15];

int min[10000][15];

int main()

for(int i=1;i<=log(n)/log(2);i++)

{for(int j=1;j>head>>tail;//輸入想要求下標從head--tail的區間最值的頭下標和尾下標

int len=tail-head+1;//區間的長度

int k=log(len)/log(2);//找出相應長度的指數

int max,min;

max=max(max[head][k],max[tail+1-(1<

RMQ演算法總結

給定乙個陣列,查詢陣列給定範圍內的最值。void rmq int num 預處理 o nlogn 演算法主體 for int j 1 j 20 j for int i 1 i num i if i 1 j 1 num maxsum i j max maxsum i j 1 maxsum i 1 j ...

RMQ演算法詳解

下面我們從乙個實際問題來解釋rmq 我們假設陣列arr為 1,3,6,7,4,2,5 我們設二維陣列dp i j 表示從第i位開始連續2 j個數中的最小值。例如dp 2 1 就表示從第二位數開始連續兩個數的最小值 也就是從第二位數到第三位數的最小值 即3,6中的最小值,所以dp 2 1 3 其實我們...

RMQ演算法題目

pku 3264 題意 給定n個奶牛的高度,求區間 s,e 中最高與最低高度的差值。rmq模板題目 求出最高最低然後求差。注意這裡f i j 表示從j開始的2 i次方個數的最值。view code include include include include define maxn 50007 d...