#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之間的最小...