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表 我可能写得不好,看专业的 怎么实现? 考虑把 ...
随机推荐
- Python第一次作业(20220909)
实例01:根据身高.体重计算BMI指数 ①:分别定义两个变量"height"和"weight",用于储存身高(单位:米)和体重(单位:千克).使用内置的prin ...
- 【BUUCTF]ACTF2020 新生赛Exec1write up
根据题目分析,俺们要用ping命令! 打开靶机,输入127.0.0.1尝试提交,直接出现无过滤: 尝试管道符执行命令,常见管道符: 1.|(就是按位或),直接执行|后面的语句 2.||(就是逻辑或), ...
- 如何利用javaweb实现数据的可视化
描述 之前一直使用html进行网页版的数据库查询啥的,没有图片的参与,也没有将一条条数据变成较为直观的图画形式,这就是来实现以下数据的图画形式 了解及基础说明 通过查阅资料,我首先了解到要是想实现数据 ...
- Spring--依赖注入:setter注入和构造器注入
依赖注入:描述了在容器中建立Bean于Bean之间依赖关系的过程 setter注入 在本来已经在service里面引用了bean的相关方法的基础上,再引用之前已经写过的userDao的对象,即在ser ...
- 重构:banner 中 logo 聚合分散动画
1. 效果展示 在线查看 2. 开始前说明 效果实现参考源码:Logo 聚集与散开 原效果代码基于 react jsx 类组件实现.依赖旧,代码冗余. 我将基于此进行重构,重构目标: 基于最新依赖包, ...
- Vue-Router 路由与配置
现在的很多应用都流行SPA应用(singe page application) . 传统的项目大多使用多页面结构,需要切换内容的时候我们往往会进行单个html文件的跳转,这个时候因受到网络.性能的影 ...
- 支付回调MQ消息的幂等处理及MD5字符串es中的使用及支付宝预授权完成
支付回调MQ消息的幂等处理及MD5字符串es中的使用及支付宝预授权完成 1.幂等的处理,根据对象的转json 转md5作为key,退款的处理 控制发送端?业务上比较难控制.支付异步通知,退款有同步通知 ...
- 探究for循环中的var与let的区别
首先饮用一篇大佬写的博客:for循环中let与var的区别,块级作用域如何产生与迭代中变量i如何记忆上一步的猜想 这篇博客对我有所启发,但是有点抽象. 再借用<JavaScript高级程序设计& ...
- Element.scrollIntoView() 方法让当前的元素滚动到浏览器窗口的可视区域内
Element.scrollIntoView() 方法让当前的元素滚动到浏览器窗口的可视区域内 语法 element.scrollIntoView(); // 等同于element.scrollInt ...
- flask目录结构及博客项目实战地址
[Flask] 项目结构说明 项目结构 Flask的一大优势就是其极其轻量化.但是也需要注意到,如果我们要用Flask做一个大项目的话,把所有代码写在一个文件里肯定是不合适的.非常难以维护.但是和 ...