首页 > 其他 > 详细

RMQ(ST表)

时间:2019-03-20 15:40:45      阅读:157      评论:0      收藏:0      [点我收藏+]
#include<iostream>
#include<cstdio>
#include<cmath> 
using namespace std;
int N, M, a[100009], l, r, st[100009][20];
inline int read()
{
    int s=0, w=1; char ch=getchar();
    while( ch<'0' || ch>'9' ){ if(ch=='-') w=-1; ch=getchar(); }
    while(ch>='0' && ch<='9'){ s=s*10+ch-'0';    ch=getchar(); }
    return s*w;
}
void pre()                                      //预处理求st表 
{
    for(register int i=1; i<=N; i++) st[i][0]=a[i];
    for(int k=1; (1<<k)<=N; k++)
        for(register int i=1; i<=N; i++)
        {
            if(i+(1<<k)-1>N) break;
            st[i][k]=max(st[i][k-1], st[i+(1<<(k-1))][k-1]);
        }
}
int maxf(int l, int r)                          //区间划分与求值 
{
    if(l==r) return st[l][0];
    int t=log(r-l)/log(2);                      //注意在Linux下log计算可能存在的潜在问题 
    return max(st[l][t], st[r-(1<<t)+1][t]);
}
int main()
{
    N=read(), M=read();
    for(register int i=1; i<=N; i++) a[i]=read();
    pre();
    for(register int i=1; i<=M; i++) l=read(), r=read(), printf("%d\n", maxf(l, r));
    return 0;
}

RMQ(ST表)

原文:https://www.cnblogs.com/lfyzoi/p/10565026.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!