rmq 和普通陣列的區別是: rmq 是二維陣列, 維度為
\, 其中 rmq
[i][
j]
rmq[i][j]
rmq[i]
[j] 表示的是從 a[i
]a[i]
a[i]
開始長度為 2
j2^j
2j的區間的最小值, 那麼顯然, 它的初始化可以遞迴進行, 且複雜度為 o(n
logn
)o(nlogn)
o(nlog
n)當要查詢 [l,
r]
[l, r]
[l,r
] 區間的最小值時, 我們可以進行如下操作:
記 len = r-l+1
得到小與等於 len 的最大的 2 的冪次, 記為 k
返回 min
min\
min然後上述操作的複雜度為 o(1
)o(1)
o(1)
#define maxn 100000
int rmq[maxn][20
];intmin
(int a,
int b)
void
init()
}}intrangemin
(int from,
int to)
這種二分的思想值得學習.!
學!
ACM常用模板 資料結構 區間最值查詢RMQ
一 基於st的rmq include include include using namespace std const intmaxn 100005 intdp maxn 20 a maxn n m s陣列下標從0開始 void init rmq intrmq intl intr void ini...
RMQ 區間最值查詢演算法
rmq range minimum maximum query 對於長度為n的數列a,回答若干詢問rmq a,i,j i,j n 返回數列a中下標在i,j裡的最小 大 值。主要方法 樸素 即搜尋 複雜度為o n 線段樹能在對數時間內在陣列區間上進行更新與查詢。預處理 o n 查詢 o logn 定義...
RMQ問題(區間最值查詢)
有一類問題被稱作區間最值問題,描述的是,給定 n 個元素,需要查詢下標位於 p q 之間的最大 小值。首先確定,針對每一次查詢,肯定是不能動態求最值的,因為每次都要計算,可能造成比較多的時間耗費。有 一種比較好的解決辦法是,先得到所有結果,在查詢時直接取出結果。這樣,就需要一種資料結構,能夠覆蓋所有...