(RMQ)求區間最值及其下標 模板

2021-08-07 07:23:27 字數 1089 閱讀 1801

#include 

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 100000;

const

int maxm = 30;

//根據題目要求,只需保留用到的就可以了

int d_min[maxn][maxm],d_max[maxn][maxm],a[maxn];

int d_min_indx[maxn][maxm],d_max_indx[maxn][maxm];

int n;//n個數字

//預處理區間最大最小值

void rmq_init()

for(j = 1; (1

<= n; i++)

}//查詢區間最小值

int rmq_min(int l,int r)

//查詢區間最大值

int rmq_max(int l,int r)

//預處理區間最大最小值的下標

void rmq_indx_init(int n,int b)

for(j=1;(1

<1

1]] < b[d_min_indx[i+(1

<<(j-1))][j-1]]? d_min_indx[i][j-1]:d_min_indx[i+(1

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

d_max_indx[i][j]=b[d_max_indx[i][j-1]] > b[d_max_indx[i+(1

<<(j-1))][j-1]]? d_max_indx[i][j-1]:d_max_indx[i+(1

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

}}//查詢區間最大值的下標

int rmq_indx_max(int s,int v,int b)

//查詢區間最小值的下標

int rmq_indx_min(int s,int v,int b)

int main()

模板 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演算法,是乙個快速求區間最值的離線演算法,預處理時間複雜度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之間的最小...