1. 程式人生 > >ST演算法求最值:

ST演算法求最值:

const int maxn=50005;
int a[maxn],dp[maxn][30],d[maxn][30];
void rmq(){
    for(int i=1;i<=n;i++){dp[i][0]=a[i];d[i][0]=a[i];}
    for(int j=1;(1<<j)<=n;j++){
        for(int i=1;i+(1<<j)-1<=n;i++){
            dp[i][j]=min(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
            d[i][j]=max(d[i][j-1],d[i+(1<<(j-1))][j-1]);
        }
    }
}
int query1(int l,int r)//min
{
    int k=0;
    while ((1<<(k+1))<=r-l+1)k++;
    return min(dp[l][k],dp[r-(1<<k)+1][k]);
}
int query2(int l,int r)//max
{
    int k=0;
    while ((1<<(k+1))<=r-l+1) k++;
    return max(d[l][k],d[r-(1<<k)+1][k]);
}