简介

ST表是利用倍增思想处理RMQ问题(区间最值问题)的一种工具。 它能够做到O(nlogn)预处理,O(1)查询的时间复杂度,效率相当不错。

算法

1.预处理

ST表利用倍增的思想。以洛谷的P3865作为例子。我们需要查询某一区间的最大值。 我们用f[ i ][ j ]表示区间i到i+2^j-1的最大值(最小值同理)。在状态转移时,我们可以把这个区间拆成两个区间,分别求最大值。  因此,状态转移方程为:

f[i][j] = max{ f[i][j-1], f[i+2^(j-1)][j-1] }

2.查询

查询也比较简单。 我们先求出log2(区间长度),令其等于k。  然后,我们对左右端点分别查询(即图中的绿色线条和红色线条),保证能够覆盖我们需要查询的整个区间。

为什么从右端点开始查询,左端点为r-2^k+1? 其实很简单,我们需要寻找一个x,使得x+2^k-1=r。所以x=r-2^k+1。

上代码:

//ST表求静态区间最大值 洛谷P3865
#include <iostream>
#include <cstdio>
#include <cmath>using namespace std;const int maxn=1e6+10;
int n,m;
int Max[maxn][21];//Max[i][j]表示区间i到i+2^j-1的最大值int read()
{char ch=getchar();int f=1;int x=0;while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}int find(int l,int r)
{int k=log2(r-l+1);//计算log2(区间长度)return max(Max[l][k],Max[r-(1<<k)+1][k]);
}int main()
{n=read();m=read();for(int i=1;i<=n;i++){Max[i][0]=read();}for(int j=1;j<=21;j++){for(int i=1;i+(1<<j)-1<=n;i++){Max[i][j]=max(Max[i][j-1],Max[i+(1<<(j-1))][j-1]);//倍增//1<<(j-1)表示2^(j-1)
        }}for(int i=1;i<=m;i++){int l=read();int r=read();printf("%d\n",find(l,r));}return 0;
}

转载于:https://www.cnblogs.com/Bw-Orzzzzz/p/10829036.html

RMQ问题-ST表倍增处理静态区间最值相关推荐

  1. 【牛客 - 371牛客OI周赛7-提高组B】小睿睿的询问(RMQ,ST表维护下标)

    题干: 链接:https://ac.nowcoder.com/acm/contest/371/B 来源:牛客网 小睿睿的n个妹纸排成一排,每个妹纸有一个颜值val[i].有m个询问,对于每一个询问,小 ...

  2. 【模板】RMQ问题—st表实现

    Luogu P3865 [模板]ST表 先放我邵哥的题解qwq邵哥太强辣!!!!!!!!!! 转载于:https://www.cnblogs.com/Hwjia/p/9804239.html

  3. poj3264(ST表模版)

    ST 表算法用于查询区间最值,为静态算法,查询区间最值时不能更新信息,预处理复杂度为 O(nlongn),查询为 O(1).适用于不更新信息且查询很多的问题. 题意:求解范围内最高的奶牛和最短的奶牛之 ...

  4. HDU2586(ST表+dfs)

    ST 表算法用于查询区间最值,为静态算法,查询区间最值时不能更新信息,预处理复杂度为 O(nlongn),查询为 O(1).适用于不更新信息且查询很多的问题. 题意:首先要计算出各个可到达点之间的长度 ...

  5. HDU5443(ST表)

    ST 表算法用于查询区间最值,为静态算法,查询区间最值时不能更新信息,预处理复杂度为 O(nlongn),查询为 O(1).适用于不更新信息且查询很多的问题. 题意:找出给定区间的最大水源. #inc ...

  6. HDU3183(ST表)

    ST (RMQ)表 ST 表算法用于查询区间最值,为静态算法,查询区间最值时不能更新信息,预处理复杂度为 O(nlongn),查询为 O(1).适用于不更新信息且查询很多的问题. 题意:从给出的一串数 ...

  7. ST表 (模板) 洛谷3865

    题目背景 这是一道ST表经典题--静态区间最大值 请注意最大数据时限只有0.8s,数据强度不低,请务必保证你的每次查询复杂度为 O(1) O(1) 题目描述 给定一个长度为 N N 的数列,和 M M ...

  8. P3865 【模板】ST表

    P3865 [模板]ST表 https://www.luogu.org/problemnew/show/P3865 题目背景 这是一道ST表经典题--静态区间最大值 请注意最大数据时限只有0.8s,数 ...

  9. keda.#1105. ST 表

    题目背景 这是一道 ST 表经典题--静态区间最大值 请注意最大数据时限只有 0.8s,数据强度不低,请务必保证你的每次查询复杂度为 O(1)O(1).若使用更高时间复杂度算法不保证能通过. 如果您认 ...

最新文章

  1. (三)Sass和Compass--制作精灵图片
  2. iOS Sprite Kit教程之场景的设置
  3. clickhouse官方文档_clickhouse分析:chproxy使用
  4. 文本和代码文件助手软件
  5. bzoj 36733674 可持久化并查集加强版(可持久化线段树+启发式合并)
  6. 深入理解Linux内存映射机制
  7. android R编译OTA时报“ExternalError: Invalid ro.product.property_source_order”解决方法
  8. 除了待办清单,用 Things 还能做什么?
  9. random-生成随机数模块
  10. 毕业设计 - 基于JAVA的小区/园区停车管理系统(简便易上手)
  11. 刘汝佳小白书-最长回文字串
  12. c语言密文加密解密问题注释,c语言通过openssl aes对称加解密和base64编解码将密码存储成密文...
  13. oracle基本命令
  14. 例题 - 最近公共祖先 - 离线算法
  15. 人到中年怎样防止头发花白
  16. 微信早安推送+定时任务配置(精简图文版)
  17. Python 进阶必备:进程模块 multiprocessing
  18. 2017级算法模拟上机准备篇(一)
  19. xmind 8 pro Mac破解版(思维导图) 附xmind 8 序列号
  20. 几种查看Matlab函数源代码的方法

热门文章

  1. 获取请求的url java_Java获取此次请求URL以及服务器根路径的方法
  2. 【技术解决方案】优化FFmpeg编码器参数设置
  3. Leetcode 08. 字符串转换整数 (atoi)
  4. 取得二进制最右面为1的数
  5. python ks值计算_利用Python计算KS的实例详解
  6. python所有的父类_object代表所有类的父类吗??
  7. c语言volatile关键字的作用是什么?
  8. 如何使用man命令linux,Linux man命令的使用方法
  9. css 样式尾部带感叹号是什么意思_CSS书写规范
  10. python list存储对象_python List 对象