【蓝桥杯】RMQ(Range Minimum/Maximum Query)

一.概述

RMQ问题,是求区间最大值或最小值,即范围最值问题。

暴力解法是对每个询问区间循环求解,设区间长度n,询问次数m,则复杂度是O ( nm )。

一般还可以使用线段树求解,复杂度是O(mlogn)。

但还有一种更简便的ST算法,预处理复杂度是O(nlogn),查询O(1)。

二.ST(Sparse Table)算法

它适用于静态空间的RMQ查询。

给定长度为n的静态数列,做m次询问,每次给定L,R \leq n,查询区间[L,R]内的最值。

原理:一个大区间若能被两个小区间覆盖,那么大区间的最值等于两个小区间的最值。(小区间有重合不影响结果)

基本思路:

1)把整个数列划分为很多小区间,并提前计算出每个小区间的最值。

按照倍增分成小区间。

每组小区间的最值,都可以从前一组递推得来。 

2 \times x\geq len设dp[i][j]表示第i处开始的2^j个数字的最值,i是开始位置,j是延伸长度,dp[i][0]是原数组a[i]本身,即边界。

状态转移方程:dp[i][j]=min(dp[i][j-1],dp[i+2^{j-1}][j-1])

这里其实就是把一个区间划分为了两个小区间,通过小区间获得最值。

计算出所有小区间的最值,复杂度为:每一组都需要计算n次,一共有log_2n

时间复杂度为:O(nlogn)

2)对任意一个区间最值查询,找到覆盖它的两个小区间,用两个小区间的最值计算。

以任意元素为起点,有长度为1、2、4、……的小区间,以任意元素为终点,也有长度为1、2、4、……的小区间。

可以将待查询区间[L,R]分为两个小区间,让这两个小区间覆盖[L,R]。一次查询的时间复杂度为:O(1)。

区间长度为len=R-L+1

2 \times x \geq len,小区间的长度为x。

三.实战演练

//ST算法 区间最大值
#include <iostream>
#include <algorithm>

using namespace std;

const int N=5e5+10;
long long dp[N][20];
int n,q;

long long st(int l,int r){
    int x=0;
    while(l+(1<<(x+1))<=r){
        x++;
    }
    return max(dp[l][x],dp[r-(1<<x)+1][x]);
}

int main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    cin>>n>>q;
    //构造dp数组
    for(int i=1;i<=n;i++){
        cin>>dp[i][0];
    }
    
    for(int j=1;j<20;j++){
        for(int i=1;i+(1<<j)-1<=n;i++){
            dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
        }
    }
    
    for(int i=0;i<q;i++){
        int x,y;
        cin>>x>>y;
        cout<<st(x, y)<<'\n';
    }
    return 0;
}

相关推荐

  1. 贪心+

    2024-03-22 01:30:05       65 阅读
  2. 简介

    2024-03-22 01:30:05       54 阅读
  3. 练习题

    2024-03-22 01:30:05       58 阅读
  4. :大写

    2024-03-22 01:30:05       40 阅读
  5. --平均

    2024-03-22 01:30:05       47 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-22 01:30:05       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-22 01:30:05       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-22 01:30:05       87 阅读
  4. Python语言-面向对象

    2024-03-22 01:30:05       96 阅读

热门阅读

  1. BitMap 和 HyperLogLog

    2024-03-22 01:30:05       42 阅读
  2. LeetCode刷题笔记之hot 100(一)

    2024-03-22 01:30:05       32 阅读
  3. MATLAB中的符号计算是什么?如何使用它?

    2024-03-22 01:30:05       42 阅读
  4. P1170 兔八哥与猎人 Python

    2024-03-22 01:30:05       31 阅读
  5. 蓝桥集训之山峰和山谷

    2024-03-22 01:30:05       43 阅读
  6. 客户端渲染与服务端渲染(1)

    2024-03-22 01:30:05       39 阅读
  7. # termux连接云服务器

    2024-03-22 01:30:05       36 阅读
  8. ES查询小技能

    2024-03-22 01:30:05       38 阅读