ST算法:静态区间最值问题
ST算法可以在
O(nlogn)
的时间内预处理,
O(1)
查询区间最值。
以最小值为例,定义
dp[i][j]
记录区间
[j,j+2i−1]
内的最小值。
方程很好转移:
dp[i][j]=min(dp[i−1][j],dp[i−1][j+2i−1])
初值即
dp[0][j]=A[j]
查询时,如果我们要查询的是区间 [x,y] ,设 d=y−x+1 , b=log2d ,需要返回的值即为 min(dp[b][x],dp[b][x=y−2b+1]) 。
当然,系统log函数较慢,可以事先打表。
for(int i=1;i<=n;i++)
dp[0][i]=A[i];
for(int i=1;i<=S;i++)
for(int j=1;j<=n;j++){
if(j+(1<<i)-1>n)break;
dp[i][j]=min(dp[i-1][j],dp[i-1][j+(1<<(k-1))]);
}