RMQ問題(ST表解法)

2021-08-10 04:21:40 字數 685 閱讀 1841

針對:範圍最值問題。對於陣列a[1…n],有操作如下:

rmq(l, r):a中第l個數到第r個數中的最小值(最大值模擬)。

d[i][j]:從i開始,長度為2j

的一段元素的最小值。可推→

d[i][j] = min(d[i][j - 1], d[i + (1 << (j - 1))][j - 1]) ;

查詢時,令k為滿足2k

<= r - l + 1的最大整數,由於求最小值可重複元素,可推→

d[l][r] = min(d[l][k], d[r - (1 << k) + 1][k])

**:

#include

using

namespace

std;

const

int mn = 1005;//mn根據資料決定

int n, q, l, r, i, j, a[mn], d[mn][10];

inline

int rmq(int l, int r)

int main()

return

0; }

rmq也可用倍增演算法和線段樹解決。

st演算法:優點:構造st表常數小,詢問只要o(1);缺點:只能對固定的數列求最值,不能修改數列中的元素。

晚上好~天時妹紙音色真美,不過女神依然是f~大愛~030

ST表 解決靜態RMQ問題

st表 解決靜態rmq問題 應用範圍比較窄,只能求解區間最值查詢,可以查最大值,也可以查最小值,一般在比賽中會和思維題放在一起考察 還有一種解決靜態rmq問題的是利用線段樹 時間複雜度 線段樹 o nlogn 預處理,單次詢問o logn 空間o n st表 o nlogn 預處理,單次詢問o 1 ...

RMQ問題的ST演算法解法

rmq range minimum maximum query 問題是指 對於長度為n的數列a,回答若干詢問rmq a,i,j i,j n 返回數列a中下標在i,j裡的最小 大 值,也就是說,rmq問題是指求區間最值的問題。樸素解法不再贅述了,非常非常暴力,理論上是不會有比賽能讓你用樸素演算法求解的...

RMQ問題 ST演算法

rmq問題 rmq問題是指求區間最值的問題。rmq演算法 st演算法 時間複雜度 預處理o nlogn 查詢o 1 以求最大值為例,設d i,j 表示 i,i 2 j 1 這個區間內的最大值,那麼在詢問到 a,b 區間的最大值時答案就是max d a,k d b 2 k 1,k 其中k是滿足2 k ...