RMQ问题-ST表倍增处理静态区间最值
简介
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表倍增处理静态区间最值相关推荐
- 【牛客 - 371牛客OI周赛7-提高组B】小睿睿的询问(RMQ,ST表维护下标)
题干: 链接:https://ac.nowcoder.com/acm/contest/371/B 来源:牛客网 小睿睿的n个妹纸排成一排,每个妹纸有一个颜值val[i].有m个询问,对于每一个询问,小 ...
- 【模板】RMQ问题—st表实现
Luogu P3865 [模板]ST表 先放我邵哥的题解qwq邵哥太强辣!!!!!!!!!! 转载于:https://www.cnblogs.com/Hwjia/p/9804239.html
- poj3264(ST表模版)
ST 表算法用于查询区间最值,为静态算法,查询区间最值时不能更新信息,预处理复杂度为 O(nlongn),查询为 O(1).适用于不更新信息且查询很多的问题. 题意:求解范围内最高的奶牛和最短的奶牛之 ...
- HDU2586(ST表+dfs)
ST 表算法用于查询区间最值,为静态算法,查询区间最值时不能更新信息,预处理复杂度为 O(nlongn),查询为 O(1).适用于不更新信息且查询很多的问题. 题意:首先要计算出各个可到达点之间的长度 ...
- HDU5443(ST表)
ST 表算法用于查询区间最值,为静态算法,查询区间最值时不能更新信息,预处理复杂度为 O(nlongn),查询为 O(1).适用于不更新信息且查询很多的问题. 题意:找出给定区间的最大水源. #inc ...
- HDU3183(ST表)
ST (RMQ)表 ST 表算法用于查询区间最值,为静态算法,查询区间最值时不能更新信息,预处理复杂度为 O(nlongn),查询为 O(1).适用于不更新信息且查询很多的问题. 题意:从给出的一串数 ...
- ST表 (模板) 洛谷3865
题目背景 这是一道ST表经典题--静态区间最大值 请注意最大数据时限只有0.8s,数据强度不低,请务必保证你的每次查询复杂度为 O(1) O(1) 题目描述 给定一个长度为 N N 的数列,和 M M ...
- P3865 【模板】ST表
P3865 [模板]ST表 https://www.luogu.org/problemnew/show/P3865 题目背景 这是一道ST表经典题--静态区间最大值 请注意最大数据时限只有0.8s,数 ...
- keda.#1105. ST 表
题目背景 这是一道 ST 表经典题--静态区间最大值 请注意最大数据时限只有 0.8s,数据强度不低,请务必保证你的每次查询复杂度为 O(1)O(1).若使用更高时间复杂度算法不保证能通过. 如果您认 ...
最新文章
- (三)Sass和Compass--制作精灵图片
- iOS Sprite Kit教程之场景的设置
- clickhouse官方文档_clickhouse分析:chproxy使用
- 文本和代码文件助手软件
- bzoj 36733674 可持久化并查集加强版(可持久化线段树+启发式合并)
- 深入理解Linux内存映射机制
- android R编译OTA时报“ExternalError: Invalid ro.product.property_source_order”解决方法
- 除了待办清单,用 Things 还能做什么?
- random-生成随机数模块
- 毕业设计 - 基于JAVA的小区/园区停车管理系统(简便易上手)
- 刘汝佳小白书-最长回文字串
- c语言密文加密解密问题注释,c语言通过openssl aes对称加解密和base64编解码将密码存储成密文...
- oracle基本命令
- 例题 - 最近公共祖先 - 离线算法
- 人到中年怎样防止头发花白
- 微信早安推送+定时任务配置(精简图文版)
- Python 进阶必备:进程模块 multiprocessing
- 2017级算法模拟上机准备篇(一)
- xmind 8 pro Mac破解版(思维导图) 附xmind 8 序列号
- 几种查看Matlab函数源代码的方法
热门文章
- 获取请求的url java_Java获取此次请求URL以及服务器根路径的方法
- 【技术解决方案】优化FFmpeg编码器参数设置
- Leetcode 08. 字符串转换整数 (atoi)
- 取得二进制最右面为1的数
- python ks值计算_利用Python计算KS的实例详解
- python所有的父类_object代表所有类的父类吗??
- c语言volatile关键字的作用是什么?
- 如何使用man命令linux,Linux man命令的使用方法
- css 样式尾部带感叹号是什么意思_CSS书写规范
- python list存储对象_python List 对象