RMQ(ST)

/*RMQ算法(ST) 求指定区间最小(大)值*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n;
int f[100000][20];//f[i][j]表示从第i个数开始,往后数2^j个数中的最值

void init()//初始化f数组
{
    for(int j=1; (1<<j)<=n; j++) //1<<j=2^j
        for(int i=1; i+(1<<j)-1<=n; i++)
            f[i][j]=min(f[i][j-1],f[i+(1<<(j-1))][j-1]);//最小值
            //f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);//最大值
}

int RMQ(int x,int y)//查询[x,y]
{
    int k=log(y-x-1)/log(2);
    return min(f[x][k],f[y-(1<<k)+1][k]);
}

int main()
{
    cin>>n;
    for(int i=1; i<=n; i++)
        cin>>f[i][0];
    init();
    for(;;)//在线查询
    {
        int x,y;
        cin>>x>>y;
        cout<<RMQ(x,y)<<endl;
    }
    return 0;
}

  

本文作者:银河渡舟
版权声明:本文采用 CC BY-NC-SA 3.0 CN协议进行许可
原文地址:https://www.cnblogs.com/widerg/p/6942803.html