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