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的區間都可以...