RMQ-ST表

作者: 雨落八千里 | 来源:发表于2019-07-24 19:02 被阅读0次

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

RMQ
  • RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回 [ A[i]~A[j] ] 中的最值。
ST
  • ST算法(Sparse Table),ST(Sparse Table)算法是一个非常有名的在线处理RMQ问题的算法,它可以在O(nlogn)时间内进行预处理,然后在O(1)时间内回答每个查询。
  • A[i][j]:表示从第i个数起连续2^j个数中的最值状态
    转移方程:A[i, j]=max/min( A [ i ][ j - 1 ] , A [ i + ( 1 << ( j - 1 ) ) ][ j - 1 ]
    A[i][j-1]:表示第i个数连续的2^(j-1)个数;
    A[i+ (1<< (j-1) ) ][j-1]:表示第(i+2^(j-1))个数起连续的2^(j-1)个数;
    A[i][j]维护的区间是[i,i+2^j-1],但在过程中将区间分成了前一半和后一半。

每一个区间[ l , r ]都可以被这种类似的区间所表达。我们假设[ l , r ]r-l+1 , 也就是区间的长度能用2^k-1所表示,也就是说我们这个区间[ l , r ]的最值就是[ l , l + 2^k -1 ]的最值,也就是A[ l ][ k ]所记录的值!
但是万一区间[ l , r ]并不能用[ l , l + 2^k -1 ]所表示呢?不必担心,先告诉你们可以用区间[ l , l+2^i-1 ][ r- ( 2^i-1 ) , r ]这两个区间的最值 取最值!为什么呢?看:


红区间的最值一定是两个黑区间的最值的并集!因为重合部分分别与两边非重合部分的最值 的最值 也就是整个红区间(询问区间)的最值!

k=log_2{(j-i+1.0)}
[i,k]维护的是:[i,i+2^k-1]
[j-(2^k)+1][k] 维护的是 :[j-(2^k)+1,j]
j-(2^k) + 1+(2^k)-1==j
那么我们只要保证j - 2 ^ k + 1 <= i + 2 ^ k- 1
就能保证m[l,r] = min/max(m[i][k], m[j - (2^k) + 1][k])
j-2^k +1<=i+2^k-1
j-i+2<=2^(k+1)
因为k=log_2{(j-i+1)}
j-i+2<=2* 2^k<=2*(j-i+1)
2<=j-i+2
0<=j-i
显然成立

Balanced Lineup
求区间的最大值和最小值

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define ll long long
using namespace std;
const int M=1000100;
int minx[M][30];
int maix[M][30];
int n,q,x,y;
void ST(int n)
{
    for(int j=1;j<=25;j++)
    {
        for(int i=1;i+(1<<j)-1<=n;i++)
        {
            maix[i][j]=max(maix[i][j-1],maix[i+(1<<(j-1))][j-1]);
            minx[i][j]=min(minx[i][j-1],minx[i+(1<<(j-1))][j-1]);
        }
    }
}
void query(int i,int j)
{
    int k=log2(j-i+1.0);
    int ans1=min(minx[i][k],minx[j-(1<<k)+1][k]);
    int ans2=max(maix[i][k],maix[j-(1<<k)+1][k]);
    printf("%d\n",ans2-ans1);
    return ;
}
int main( )
{
    scanf("%d%d",&n,&q);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        minx[i][0]=maix[i][0]=x;
    }
    ST(n);
    while(q--)
    {
        scanf("%d%d",&x,&y);
        query(x,y);
    }
    return 0;

}

相关文章

  • RMQ-ST表

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

  • Least Common Ancestor

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

  • RMQ-ST算法[转]

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

  • POJ3368-Frequent values(RMQ-ST)

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

  • HDU3183-A Magic Lamp(RMQ-ST)

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

  • 商城典型表设计

    后台用户表 角色表 权限表 商品类型表 属性表 商品属性表 商品分类表 商品表 会员表 购物车表 订单表 订单商品...

  • 宽表、窄表、维度表、事实表

    一、概念 宽表:把多个维度的字段都放在一张表存储,增加数据冗余是为了减少关联,便于查询,查询一张表就可以查出不同维...

  • 制作一个简单的99乘法表

    表相当于 列表[0]表[1]表[2]表[3]表[4]表[5]表[6]表[7]表[8]表[9]-0123456789...

  • 钟繇五表

    还示表 荐季直表 荐季直表 墓田帖 力命表 贺捷表 贺捷表 宣示表 宣示表 宣示表

  • 数据库设计

    表 病人信息表 样品信息表 测序记录表 基因位点表 变异信息表 测序变异表 套餐信息表 癌症信息表 结构变异信息 ...

网友评论

    本文标题:RMQ-ST表

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