RMQ問題 高效離線演算法 ST

2021-10-03 17:17:54 字數 952 閱讀 5457

st演算法是一種解決靜態詢問區間最值問題的高效離線演算法,演算法上採用了倍增的思想,而實現上則是利用了動態規劃,具體流程如下所示:

對於區間[begin , end],將其拆分為兩個區間:[begin , begin+

設f[i][j]表示區間[i , i+

f[ begin ][ x ]= max/min d=log_\frac*2=log_\frac+log_2=log_\frac+1" class="mathcode" src=""/>,初值為

0     1      2      3      4      5      6     7      8      9      10      11

我們得到其區間長度為:12 ,首先預處理求出所有的x值:

1-0、 2-1、 3-1、 4-2、 5-2、 6-2、 7-2、 8-3、 9-3、 10-3、 11-3、 12-3

它能拆分出的最長的兩個長度為

然後繼續對[0 , 7]  [4 , 11]進行逐漸拆分,直到

每行依次返回最大值:

同理另一區間的返回值為11,所以得到最終的答案為max=11.

示例**

#include#includeusing namespace std;

const int n = 100005, x = 25;

int num[n],log[n];

int f[n][x]; //f的含義是從n到n+2^x-1(長度為2^x)的範圍內的最大值/最小值

int main()

return 0;

}

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

RMQ問題的ST演算法

st sparse table 演算法的基本思想是,預先計算從起點a i 開始長度為2的j次方 j 0,1.logn 的區間的最小值,然後在查詢時將任何乙個區間a i.j 劃分為兩個預處理好的可能重疊的區間,取這兩個重疊區間的最小值。在預處理階段,從起點a i 開始,任何乙個長度為2 j的區間都可以...

RMQ問題的ST演算法

st sparse table 演算法的基本思想是,預先計算從起點a i 開始長度為2的j次方 j 0,1.logn 的區間的最小值,然後在查詢時將任何乙個區間a i.j 劃分為兩個預處理好的可能重疊的區間,取這兩個重疊區間的最小值。在預處理階段,從起點a i 開始,任何乙個長度為2 j的區間都可以...