RMQ 求區間最值

2021-09-29 10:31:40 字數 839 閱讀 6560

rmq演算法,是乙個快速求區間最值的離線演算法,預處理時間複雜度o(n*log(n)),查詢o(1)。

概念:rmq(range minimum/maximum query),即區間最值查詢,是指這樣乙個問題:對於長度為n的數列a,回答若干詢問rmq(a,i,j)(i,j<=n),返回數列a中下標在i,j之間的最小/大值。

設a[i]是要求區間最值的數列,f[i, j]表示從第i個數起連續2j個數中的最大值。(dp的狀態)

例如:a數列為3 2 4 5 6 8 1 2 9 7

首先初始化f[i,0]=a[i],f[1,0]代表從第乙個數,長度為20的最大值,即為3。同理f[1,1]=max=3,f[1,2]=max=5。

推導狀態轉移方程

將f[i,j]平均分成兩份(f[i,j]一定是偶數),從i到i+2j-1-1為一段,i+2j-1到i+2j-1為一段。(長度都為2j-1)

例如:當i=1,j=3時就是3,2,4,5和6,8,1,2,f[i,j]就是這兩段中各自的最大值。

由此狀態轉移方程為:f[i,j]=max。

**如下:

void

rmq(

int num)

//num是數量

for(

int j=1;

(1<<=num; j++

)for

(int i=

1; i+(1

<<=num; i++)}

void

query

(int l,

int r,

int op)

//op=1 查詢最大值,op=0,查詢最小值

RMQ求區間最值

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

模板 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 求區間最值(poj 3264)

1.概述 rmq range minimum maximum query 即區間最值查詢,是指這樣乙個問題 對於長度為n的數列a,回答若干詢問rmq a,i,j i,j n 返回數列a中下標在i,j之間的最小 大值。這兩個問題是在實際應用中經常遇到的問題,下面介紹一下解決這兩種問題的比較高效的演算法...