模板 RMQ求區間最值

2021-08-21 21:18:37 字數 808 閱讀 3071

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的時候該區間的長度始終為偶數,可以分為區間[i,i+2j-1-1]和區間[i+2j-1-1,i+2j-1],即取兩個長度為2j-1的塊取代和更新長度為2j的塊;

動歸過程為

void st(int n) {

for(int i=1; i<=n; i++) f[i][0]=a[i];

for(int j=1; (1《找到各區間的最值之後,由於f[i][j]表示 從 i 開始 到i+2j -1這個區間中的最大值

該如何輸出區間[l,r]的最值?

int rmq(int l,int r) {

int j=0;

while((1<<(j+1))<=r-l+1) j++;

return max(f[l][j],f[r-(1<完整**為

#include#include#includeusing namespace std;

int f[500][500],a[1000];

void st(int n) {

for(int i=1; i<=n; i++) f[i][0]=a[i];

for(int j=1; (1<

RMQ求區間最值

rmq演算法,是乙個快速求區間最值的離線演算法,預處理時間複雜度o n log n 查詢o 1 所以是乙個很快速的演算法,當然這個問題用線段樹同樣能夠解決。問題 給出n個數ai,讓你快速查詢某個區間的的最值。一 首先是預處理,用動態規劃 dp 解決。設a i 是要求區間最值的數列,f i,j 表示從...

RMQ 求區間最值

rmq演算法,是乙個快速求區間最值的離線演算法,預處理時間複雜度o n log n 查詢o 1 概念 rmq range minimum maximum query 即區間最值查詢,是指這樣乙個問題 對於長度為n的數列a,回答若干詢問rmq a,i,j i,j n 返回數列a中下標在i,j之間的最小...

RMQ 區間最值 模板

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