RMQ问题ST表
稀疏表(Sparse Table表)
解决静态RMQ,区间最值查询问题的数据结构,树状数组(BIT)解决动态前缀和问题的数据结构;


例:https://www.luogu.org/problemnew/show/P3865
原理:把给定区间分成长度是2的幂次的小区间。先预处理出它们中的最小值是多少,然后用一种类似二分的思想由小区间到大区间比较两个区间的最小值。
ST算法,设f[i][j]f[i][j]表示从序列的第ii个位置开始ajaj个数的最大值,我们可以得到公式f[i][j]=max(f[i][j−1],f[i+2j−1][j−1])f[i][j]=max(f[i][j−1],f[i+2j−1][j−1]),相当于把一个从ii到2j2j的区间分成了两个长度为2j−12j−1的区间。当我们查询最大值的时候,我们可以算出一个kk,就是让2k<2k<这个区间长度时,kk的最大值,那么我们查询的区间(l,r)(l,r)的答案就为max(f[l][k],f[r−2k+1][k])max(f[l][k],f[r−2k+1][k]),这两段刚好覆盖了这个区间,所以答案是准确的。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn=1e5+10;
//区间最值的ST表做法;
int n,m,x,y,f[maxn][22]; //一维是端点,二维是长度(二的幂次级别); int main()
{
scanf("%d%d",&n,&m); //n个元素,m个询问
for(int i=1;i<=n;i++)scanf("%d",&f[i][0]);
for(int j=1;j<=20;j++)
{
for(int i=1;i+(1<<j)-1<=n;i++)
{
f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);//每个区间的更新一分为二
}
}
while(m--){ //ST表的查询;
scanf("%d%d",&x,&y);
int k=log2(y-x+1); //区间长度可达的最大的幂次级;
printf("%d\n",max(f[x][k],f[y-(1<<k)+1][k]));
//从左端点查询长度为查询的区间的最大2次幂可达值,在从右端点查询,这两个区间一定会有重合,并完全覆盖查询区间.
}
return 0;
}
RMQ问题ST表的更多相关文章
- 线段树(two value)与树状数组(RMQ算法st表)
士兵杀敌(三) 时间限制:2000 ms | 内存限制:65535 KB 难度:5 描述 南将军统率着N个士兵,士兵分别编号为1~N,南将军经常爱拿某一段编号内杀敌数最高的人与杀敌数最低的人进行比 ...
- RMQ问题 - ST表的简单应用
2017-08-26 22:25:57 writer:pprp 题意很简单,给你一串数字,问你给定区间中最大值减去给定区间中的最小值是多少? 用ST表即可实现 一开始无脑套模板,找了最大值,找了最小值 ...
- Codeforces 803G Periodic RMQ Problem ST表+动态开节点线段树
思路: (我也不知道这是不是正解) ST表预处理出来原数列的两点之间的min 再搞一个动态开节点线段树 节点记录ans 和标记 lazy=-1 当前节点的ans可用 lazy=0 没被覆盖过 els ...
- RMQ、ST表
ST表 \(\text{ST}\) 表是用于解决可重复贡献问题的数据结构. 可重复贡献问题:区间按位和.区间按位或.区间 \(\gcd\) .区间最大.区间最小等满足结合律且可重复统计的问题. 模板预 ...
- RMQ(ST表)
#include<iostream> #include<cstdio> #include<cmath> using namespace std; int N, M, ...
- RMQ求解->ST表
ST表 这是一种神奇的数据结构,用nlogn的空间与nlongn的预处理得出O(1)的区间最大最小值(无修) 那么来看看这个核心数组:ST[][] ST[i][j]表示从i到i+(1<<j ...
- RMQ的st表算法
此算法可用来处理区间最值问题,预处理时间为O(nlogn),查询时间为O(1) 此算法主要基于倍增思想,用以数组st[i][j]表示从第i个元素开始向后搜2的j次方的最值 可用递推的方式求得:st[i ...
- 【模板】RMQ问题 ST表
洛谷3865 #include<cstdio> #include<algorithm> #include<cmath> using namespace std; ; ...
- 51Nod.1766.树上最远点对(树的直径 RMQ 线段树/ST表)
题目链接 \(Description\) 给定一棵树.每次询问给定\(a\sim b,c\sim d\)两个下标区间,从这两个区间中各取一个点,使得这两个点距离最远.输出最远距离. \(n,q\leq ...
- st表 LCA
我当时知道ST表可以 \(O(1)\) 求 LCA 的时候是极为震惊的,可以在需要反复使用 LCA 的时候卡常使用. ST表!用于解决 RMQ问题 ST表 我可能写得不好,看专业的 怎么实现? 考虑把 ...
随机推荐
- 不同时间格式转换问题_python2
def unix_to_cst(data): """2019-03-17 11:00:00 --> Sun, 17 Mar 2019 11:00:00 GMT+08 ...
- 【转载】Python:logging详细版
转载自:https://www.cnblogs.com/Nicholas0707/p/9021672.html 一.logging模块 (一).日志相关概念 日志是一种可以追踪某些软件运行时所发生事件 ...
- Notepad++行转列
行转列\r\n
- 发布订阅者模式 -- 简单的PubSub
/** * 发布订阅者模式 * **/interface handle { [propName: string]: Function[]}class PubSub { private handles: ...
- Android studio的基本使用--基础篇
一.新建项目 其实跟IDEA新建项目的流程基本一致,File->New->New project,这样就能够新建出来一个项目啦! 一般情况下,我们都会选择Empty Activity,之后 ...
- 19.new和delete用于数组
程序1: //2022年9月20日22:06:27 #include <iostream> #pragma warning(disable:4996) using namespace st ...
- 帮你积累音视频知识,Agora 开发者漫游指南正式启航
"运气是设计的残留物."--John Milton 如果玩过<全面战争:中世纪 II>,或者读过 John Milton 书的人,可能对这句话有印象.我们发现,很多小伙 ...
- 如何通过Java代码在Word中创建可填充表单
有时候,我们需要制作一个Word模板文档,然后发给用户填写,但我们希望用户只能在指定位置填写内容,其他内容不允许编辑和修改.这时候我们就可以通过表单控件来轻松实现这一功能.本文将为您介绍如何通过Jav ...
- dart基础---->单例singleton
At least, there are three ways to create the singleton object with dart. 1. factory constructor clas ...
- 购物车,实现增删改查;无bug,还有一个直接修改购物车数量功能未实现
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...