poj 3264 RMQ問題 ST演算法

2021-06-18 06:45:49 字數 760 閱讀 5840

部落格已遷至:www.lfy2us.com

比較裸的rmq問題,即對乙個無序陣列,查詢q次,每次查詢某個區間內最大值與最小值之差。

解決此問題的演算法有三種

1、最簡單的方法就是o(n)了

2、線段樹

3、st(sparse table)演算法

其中st演算法為解此問題的最佳方法 預處理時間複雜度o(nlogn),查詢時間複雜度o(1)

st演算法描述如下:

1、先對陣列進行預處理

預處理使用dp的思想,f(i, j)表示[i, i+2^j - 1]區間中的最小值,我們可以開闢乙個陣列專門來儲存f(i, j)的值。

2、查詢

假設要查詢從m到n這一段的最小值, 那麼我們先求出乙個最大的k, 使得k滿足2^k <= (n - m + 1).

#include #include #include #include #define min(a,b) a>b?b:a

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

int height[50000],f[50000][20],fmax[50000][20];

int main()

{ int n,q,i,j,k,m,a,b,range_max,range_min;

int temp;

scanf("%d%d",&n,&q);

for (i=0;i50000)

break;

for (m=0;m

POJ 3264 RMQ問題 ST演算法

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

poj3264 RMQ問題的ST演算法

rmq range minimum maximum query 即查詢給定區間的最值。問題描述 對於給給定的陣列a 1 n 回答若干次查詢檔案rmq i,j 即返回陣列a i j 的最大值 最小值 問題分析 該問題可以使用樸素查詢法,也可以用線段樹,st演算法,rmq與lca互相轉換。這裡我們分析高...

poj3264 rmq演算法學習 ST表

解題關鍵 rmq模板題,可以用st表,亦可用線段樹等資料結構 log10和log2都可,這裡用到了對數的換底公式 類似於區間dp,用到了倍增的思想 f i j min f i j 1 f i 1 j 1 j 1 1 include2 include3 include4 include5 includ...