ST算法

来源:互联网 发布:vim c语言高亮 编辑:程序博客网 时间:2024/05/17 08:10

ST算法:静态区间最值问题

ST算法可以在O(nlogn)的时间内预处理,O(1)查询区间最值。
以最小值为例,定义dp[i][j]记录区间[j,j+2i1]内的最小值。
方程很好转移:

dp[i][j]=min(dp[i1][j],dp[i1][j+2i1])

初值即
dp[0][j]=A[j]

查询时,如果我们要查询的是区间[x,y],设d=yx+1b=log2d,需要返回的值即为min(dp[b][x],dp[b][x=y2b+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))]);    }
2 0