RMQ 區間最值 模板

2021-07-23 14:45:13 字數 779 閱讀 9231

rmq 的全稱為range max/min query。

構造dp陣列的時間為o(nlogn), 但是查詢時間為o(1),所以當資料量小於logn時,用樸素遍歷找最值就好,但是請求次數大於logn時,就要用這個模板。

利用動態規劃的思想。

int

order[maxn];//使每乙個2^order[i] <= i <= 2^(order[i]+1)

void init_order(int n)

//求值

//2^20 > maxn,動態規劃,儲存最優值

int dp_min[maxn][20];

void init_rmq_min(int n, int v)

int ask_rmq_min(int l, int r)

int dp_max[maxn][20];

void init_rmq_max(int n, int v)

int ask_rmq_max(int l, int r)

//求下標

int dp_min_idx[maxn][20];

void init_rmq_min_idx(int n, int v)

int ask_rmq_min_idx(int l, int r, int v)

int dp_max_idx[maxn][20];

void init_rmq_max_idx(int n, int v)

int ask_rmq_max_idx(int l, int r, int v)

模板 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(模板 ST 區間最值,區間頻繁次數)

ps 介紹 rmq演算法,是乙個快速求區間最值的離線演算法,預處理時間複雜度o n log n 查詢o 1 所以是乙個很快速的演算法,當然這個問題用線段樹同樣能夠解決。1 求區間的最大值和最小值!如下 include include include include using namespace s...

演算法競賽模板 RMQ(計算區間最值)

一維rmq 1 dp i,j 表示從第i個數起連續2j個數中的 最大值min 最小值max 最大公約數gcd 通過更改下列 中的紅色函式即可實現。2 b陣列放置所需查詢的數列。const int max 305 int dp max 20 int mm max void initrmq int n,...