RMQ演算法 ST表

2021-09-25 09:41:49 字數 2480 閱讀 2954

題目大意就是給你兩個長度為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中下標在i,j裡的最小(大)值,也就是說,rmq問題是指求區間最值的問題。

這樣就涉及到了rmq演算法 當然這也是其中一種做法還可以用單調棧維護寫或者建立兩個笛卡爾樹比較字首p的時候他們是否相同 而我也談下自己在總結這個題的時候學到的知識

第乙個樣例

21 2

2 1那麼對於第一組數區間最小值下標 長度為1的時候後就是1 長度為2 及1 2的時候最小值下標仍為1

同理第二組資料 1 2 所以要保證有相同的最小值下標 那麼就是1

第二組樣例

最小值下標

1 2 2

1 2 2

所以輸出3

同樣最後一組

1 2 2 2 2

1 2 2 2 5

所以最多是第四個輸出4

那麼什麼是rmq演算法

仔細觀察發現 正好為區間 的長度len,所以只要區間長度一定,k就能在常數時間內求出來。而區間長度只有n種情況,所以k可以通過預處理進行預存。

舉個例子

我們假設陣列arr為:1 5 7 9 3 2 6 4

我們設二維陣列dp[i][j]表示從第i位開始連續2^j個數中的最小值。例如dp[2][1]就表示從第二位數開始連續兩個數的最小值(也就是從第二位數到第三位數的最小值),即5,7中的最小值,所以dp[2][1] = 5

其實我們求 dp[i][j] 的時候可以把它分成兩部分,第一部分是從 i 到 i + 2 ^( j-1 ) - 1 ,第二部分從 i + 2 ^( j-1 ) 到i + 2^j -1 ,為什麼可以這麼分呢?其實我們都知道二進位制數前乙個數是後乙個的兩倍,那麼可以把 i ~ i + 2^j -1 這個區間 通過2^(j-1) 分成相等的兩部分, 那麼轉移方程很容易就寫出來了。(dp[i][0]就表示第i個數字本身)

那麼根據這個思路就可以建立乙個st表來求出區間的最小or最大值

#include#include#include#include#include#includeusing namespace std;

const int maxn=1e5+5;

int dp[maxn][20];//記錄最小值

int dp2[maxn][20];//記錄最大值

int a[maxn];

int n;

void rmq_init()

rmq_init();

int m;

cin>>m;

while(m--)

int main()

///#define getchar()(p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? eof : *p1++)

///char buf[(1 << 21) + 1], *p1 = buf, *p2 = buf;

#define io cin.tie(0),ios::sync_with_stdio(false);

#define pi acos(-1)

#define pii pairll read()

#define read read()

/** keep hungry and keep calm! **/

int n,a[maxn],b[maxn],st[maxn],ans[maxn];

int judge(int r)

top = 0;

for(int i=1;i<=r;i++)

top = 0;

for(int i=r;i>=1;i--)

top = 0;

for(int i=r;i>=1;i--)

return 1;}

int sheryang()

for(int i=1;i<=n;i++)

int l=1,r=n,mid,ans=1;

while(l<=r)else

}printf("%d\n",ans);

}return 0;

}

這次比賽最大的感悟就是二分查詢答案,遞迴驗證區間是否符合題意,菜的真實。。。繼續刷題吧

RMQ的ST表演算法

rmq range minimum maximum query 即區間最值查詢,是指這樣乙個問題 對於長度為n的數列a,回答若干次詢問rmq i,j 返回數列a中下標在區間 i,j 中的最小 大值。本文介紹一種比較高效的st演算法解決這個問題。st sparse table 演算法可以在o nlog...

RMQ演算法小結(ST表)

rmq range minimum maximum query 問題是指 對於長度為 n 的數列 a,回答若干詢問 rmq a i j i j n 返回數列a中下標在 i j 裡的最小 大 值,也就是說,rmq問題是指求區間最值的問題。關於rmq問題,還是有很多方法來求解的 像線段樹啊什麼的 這裡主...

RMQ問題 ST演算法

rmq問題 rmq問題是指求區間最值的問題。rmq演算法 st演算法 時間複雜度 預處理o nlogn 查詢o 1 以求最大值為例,設d i,j 表示 i,i 2 j 1 這個區間內的最大值,那麼在詢問到 a,b 區間的最大值時答案就是max d a,k d b 2 k 1,k 其中k是滿足2 k ...