RMQ—ST

作者: Tsukinousag | 来源:发表于2021-03-21 17:22 被阅读0次

原题链接

在RMQ问题中,著名的ST算法就是倍增的产物。给定一个长度为N的序列A,ST算法能够在O(NlogN)的时间的预处理后,以O(1)的时间复杂度在线回答"数列A的下标在l~r之间的最大值是多少"

#include <iostream>
#include <algorithm>
#include <cmath>

using namespace std;
const int N=1e5+10;
int a[N];
int dp[N][110];
int n,m;

void ST_prework()
{
    //数列在子区间[i,i]里的最大值
    for(int i=1;i<=n;i++)   dp[i][0]=a[i];
    
    int t=log(n)/log(2)+1;
    //枚举区间长度倍增类型
    for(int j=1;j<t;j++)
    {
        for(int i=1;i<=n-(1<<j)+1;i++)//枚举起点
        {
            dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
        }
    }
}

int ST_query(int l,int r)
{
    //计算出那么一个k,满足(2的k次<=r-l+1<2的k+1次),查找区间达到最大
    int k=log(r-l+1)/log(2);
    return max(dp[l][k],dp[r-(1<<k)+1][k]);
}

int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    ST_prework();
    for(int i=1;i<=m;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        int k=ST_query(x,y);
        printf("%d\n",k);
    }
    return 0;
}

相关文章

  • RMQ—ST

    原题链接[https://www.acwing.com/problem/content/1272/] 在RMQ问题...

  • RMQ-ST表

    以前学RMQ的时候完全不懂,最近写到了类似的题,在看了几篇博客,加上以前整理的笔记,才加深了对RMQ算法的理解。R...

  • RocketMQ 异常分析 [TIMEOUT_CLEAN_QUE

    现象: 在对 RMQ 做集群压测时,偶现 [TIMEOUT_CLEAN_QUEUE]broker busy, st...

  • RMQ-ST算法[转]

    转自这个博客 文章中间我会利用/**/符号附一些自己的理解 概述 RMQ(Range Minimum/Maxim...

  • Least Common Ancestor

    题目链接:最近公共祖先 树链剖分: Tarjan(离线)算法: 原创模板: RMQ-ST(在线)算法: 题目链接:...

  • RMQ问题详解(线段树,树状数组,ST,RMQ转LCA,Spla

    由于当年的百度空间和网易博客上发布的内容都因为这两个博客的停止维护都不在啦,现在上了大学,就读的也是计算机专业,有...

  • POJ3368-Frequent values(RMQ-ST)

    Frequent values题意:给出一串非递减序列,询问区间中出现次数最多的数的次数是多少?思路:非递减序列,...

  • HDU3183-A Magic Lamp(RMQ-ST)

    A Magic Lamp给出长度不超过1000个数字的数,删除n个数使剩下来的数最小。思路参考:Codeforce...

  • RMQ

    优化可以存log2(N),pow(2,n)可以用<< 来实现

  • 区间---RMQ区间最值查询

    RMQ区间最值查询,对于长度为n的数组A[]。RMQ(i,j),返回数组A区间[i , j]内的最大值或最小值。 ...

网友评论

      本文标题:RMQ—ST

      本文链接:https://www.haomeiwen.com/subject/nbqocltx.html