RMQ問題ST演算法 POJ 3264

2021-04-24 04:30:46 字數 799 閱讀 5876

st演算法o(nlogn)預處理,o(1)的查詢指定區間的最值(以最小值為例)

基本上是把待求區間[l,r]分為兩段長為len的區間

左邊一段為[l,l+len-1],右邊一段為[r-len+1,r]

len必須使得兩段區間覆蓋待求區間

設所求陣列為w

那麼,所求最小值就是兩個區間的最小值間的最小值

即min(min,min)

若都在預先處理中先求得兩個區間的最小值

則每次查詢的複雜度都是o(1)

---

對len做乙個限制:只能為2的冪

在預處理中求出所有mi[b][t] : 以b為起點,長為2^t的區間的最小值.

則求解min(min,min)

就變成min(mi[l][t],mi[r-2^t+1][r]),其中t可以由此得出,以保證兩段區間可以覆蓋待求區間:

t=ln(r-l+1)/ln(2)

---

可以看到mi[b][t]=min(mi[b][t-1],mi[b+2^(t-1)-1][t-1])

特別地對於所有mi[i][0],其值都是w[i];

由此自底向上推出所有的mi[b][t]

mi大小為n*logn,預處理時間複雜度為o(nlogn),查詢時間複雜度為o(1)

#include

#include

#define max(a,b) ((a>b)?a:b)

#define min(a,b) (a0;j--)

}for(i=1;i<=m;i++)}}

int rmq(int l,int r)

poj 3264 RMQ問題 ST演算法

部落格已遷至 www.lfy2us.com 比較裸的rmq問題,即對乙個無序陣列,查詢q次,每次查詢某個區間內最大值與最小值之差。解決此問題的演算法有三種 1 最簡單的方法就是o n 了 2 線段樹 3 st sparse table 演算法 其中st演算法為解此問題的最佳方法 預處理時間複雜度o ...

POJ 3264 RMQ問題 ST演算法

因為之前都是線段樹解決rmq問題,省腦子 因為寫的順手 但是因為rmq畢竟常數大,而且其實程式還相對st要長 以前寫過st演算法,但是因為每次都在糾結到底 1 呢,還是 1呢,邊界問題處理的我蛋都碎了好幾次,這次重新學習了一下st sparse table 演算法,好好的處理了這些問題的理解。st演...

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 ...