①一維rmq
(1)dp[i,j]表示從第i個數起連續2j個數中的(最大值min、最小值max、最大公約數gcd……),通過更改下列**中的紅色函式即可實現。
(2)b陣列放置所需查詢的數列。
constint 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 定義...