演算法競賽模板 RMQ(計算區間最值)

2022-09-06 11:00:28 字數 1697 閱讀 3342

①一維rmq

(1)dp[i,j]表示從第i個數起連續2j個數中的(最大值min、最小值max、最大公約數gcd……),通過更改下列**中的紅色函式即可實現。

(2)b陣列放置所需查詢的數列。

const

int max=305

;int dp[max][20

];int

mm[max];

void initrmq(int n,int

b)

for(int j=1;j<=mm[n];j++)

for(int i=1;i+(1

<1

<=n;i++)

dp[i][j]=max(dp[i][j-1],dp[i+(1

<<(j-1))][j-1

]);}

ll rmq(

int x,int

y)

②二維rmq

給定乙個n*m矩陣,每次詢問左上角(r1,c1)到右下角(r2,c2)的子矩形中的(最大值min、最小值max、最大公約數gcd……)並輸出。如果每次所詢問的四個角有符合條件的數,輸出yes,否則輸出no。

#include#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;const

int max=305

;int

val[max][max];

int dp[max][max][9][9];//

最大值int

mm[max];

void initrmq(int n,int m)//

m*n的矩陣

int rmq(int x1,int y1,int x2,int y2)//

所查詢矩形區間內的最大值 左上角(x1,y1) -> 右上角(x2,y2)

intmain()

}return0;

}

③二維rmq降維

給定乙個n*n(n<=500)的矩陣(即是正方形),每次詢問以(x,y)為左上角,邊長為s的正方形區域內的最大值。

dp[i][j][k]:以(i,j)為左上角,邊長為2^k的正方形區域內的最大值。

#include#include

#include

#include

using

namespace

std;

typedef

long

long

ll;const

int max=505

;int dp[max][max][10

],mm[max],val[max][max];

void initrmq(intn)}

int rmq(int x,int y,int

s)int

main()

}return0;

}

RMQ 區間最值 模板

rmq 的全稱為range max min query。構造dp陣列的時間為o nlogn 但是查詢時間為o 1 所以當資料量小於logn時,用樸素遍歷找最值就好,但是請求次數大於logn時,就要用這個模板。利用動態規劃的思想。int order maxn 使每乙個2 order i i 2 ord...

模板 RMQ求區間最值

rmq簡單來說就是求區間的最大值 最小值 核心演算法 動態規劃 rmq 以下以求最大值為例 f i,j 表示 從 i 開始 到i 2j 1這個區間中的最大值 狀態轉移方程 f i,j max f i,j 1 f i 2 j 1,j 1 我們可以把區間 i,i 2j 1 平均分為兩個區間,因為j 1的...

RMQ 區間最值查詢演算法

rmq range minimum maximum query 對於長度為n的數列a,回答若干詢問rmq a,i,j i,j n 返回數列a中下標在i,j裡的最小 大 值。主要方法 樸素 即搜尋 複雜度為o n 線段樹能在對數時間內在陣列區間上進行更新與查詢。預處理 o n 查詢 o logn 定義...