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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350626.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tf.layers.dropout

dropout 是指在深度学习网络的训练过程中&#xff0c;对于神经网络单元&#xff0c;按照一定的概率将其暂时从网络中丢弃&#xff0c; 可以用来防止过拟合&#xff0c;layers 模块中提供了 tf.layers.dropout() 方法来实现这一操作&#xff0c;定义在 tensorflow/python/layers…

nginx是干嘛用的_nginx小技巧 -非root身份运行nginx

简直罪过&#xff0c;写这篇文章完全是一场毫无意义的口水仗引起的&#xff0c;我这人就这样&#xff0c;喜欢拿事实说话&#xff0c;而不是一句话说的让人摸不着头脑&#xff01;下载源码文件&#xff1a;wget http://nginx.org/download/nginx-1.16.1.tar.gz解压&#xff1a;…

pooling池化

pooling&#xff0c;即池化&#xff0c;layers 模块提供了多个池化方法&#xff0c;这几个池化方法都是类似的&#xff0c;包括 tf.layers.max_pooling1d()、tf.layers.max_pooling2d()、tf.layers.max_pooling3d()、tf.layers.average_pooling1d()、tf.layers.average_pooling…

mysql 数据迁移_MySQL海量数据迁移

数据库迁移本主前一段时间写毕业设计主要使用MySQL&#xff0c;紧锣密鼓的开发了将近一个多月&#xff0c;项目数据层、接口层、数据采集层已经开发完成&#xff0c;算法还在不断的优化提速&#xff0c;由于请了几位大佬帮我做Code Review&#xff0c;所以不得已购买了一个阿里…

数组中重复的数字

解决问题思路1. 代码实现&#xff1a; package j2;import java.util.Arrays;/*** Created by admin on 2019/5/8.*/ public class FindDuplicate {public static void duplicate(int[] numbers,int length,int[]duplication){//边界条件的判断if (numbers null || length0) {r…

eclipse中junit_在Eclipse中有效使用JUnit

eclipse中junit最近&#xff0c;我被卷入了讨论1和一些受感染的同伴2&#xff0c;他们关于我们如何在Eclipse IDE中使用JUnit 。 令人惊讶的是&#xff0c;对话带来了并非所有人都知道的一些“技巧”。 这使我有了写这篇文章的想法&#xff0c;总结了我们的演讲。 谁知道–也许…

BFS迷宫问题模型(具体模拟过程见《啊哈算法》)

题目描述与DFS模型走迷宫那篇一样。小哈被困在迷宫里&#xff0c;小哼解救小哈。 这里用BFS来写。BFS&#xff08;广搜&#xff09;与DFS&#xff08;深搜&#xff09;的区别就在于&#xff0c;DFS是“不撞南墙不回头”&#xff0c;一条路走到不能再走之后才会回到起始点&#…

Spring Batch可重启性

首先&#xff0c;我要非常感谢Spring的优秀人员&#xff0c;他们花了无数时间来确保Spring Batch作业的可行性&#xff0c;以及发出重新启动作业的神奇能力&#xff01; 感谢您提供的这个优雅的工具集&#xff0c;它使我们能够浏览大量数据集&#xff0c;同时使我们在跌倒时能够…

tf.clip_by_value()

tf.clip_by_value(A, min, max) 输入一个张量A&#xff0c;把A中的每一个元素的值都压缩在min和max之间。 小于min的让它等于min&#xff0c;大于max的元素的值等于max。

python如何导入seaborn_Seaborn - 导入数据集和库

教 程 目 录 在本章中&#xff0c;我们将讨论如何导入数据集和库.让我们首先了解如何导入库. 导入库 让我们从导入Pandas开始&#xff0c;这是一个管理关系的好库(表格式)数据集. Seaborn在处理DataFrames时非常方便&#xff0c;DataFrames是用于数据分析的最广泛使用的数据结构…

Windows安装Redis(转!)

转自https://www.cnblogs.com/wxjnew/p/9160855.html “现在我已经走到了人生的十字路口边了&#xff0c;我相信&#xff0c;在已走过的人生道路中&#xff0c;我一直知道其中哪一条是正确的&#xff0c;是的&#xff0c;我一直坚信我知道。但是我却从未选择那些正确的道路&…

弃用Java的终结器

JDK-8165641 &#xff08;“ Deprecate Object.finalize”&#xff09;已打开以“ deprecate Object.finalize&#xff08;&#xff09; ”&#xff0c;因为“ finalizer本质上存在问题&#xff0c;使用finalizer可能会导致性能问题&#xff0c;死锁&#xff0c;挂起和其他问题…

python安装mysqlclient_Python-安装mysqlclient(MySQLdb)

mysqlclient&#xff08;也就是Python3版本的MySQLdb&#xff09;&#xff0c;性能比pymysql好&#xff0c;速度更快及PyMySQL的应用场景&#xff1b;所以一般大项目建议使用MySQLdb 使用pip安装 pip install mysqlclient 安装过程中可能会出现如下问题&#xff1a;解决方法如下…

tesorflow 填充‘same’与‘valid’

源码&#xff1a; #codingutf-8import tensorflow as tf# case 2 input tf.Variable(tf.random_normal([1, 256, 256, 3]))op1 tf.layers.conv2d(inputsinput, filters164, kernel_size(7, 7), strides(2, 2), padding"same", activationtf.nn.relu)op2 tf.layer…

hadoop中两种上传文件方式

记录如何将本地文件上传至HDFS中 前提是已经启动了hadoop成功&#xff08;nodedate都成功启动&#xff09; ①先切换到HDFS用户 ②创建一个user件夹 bin/hdfs dfs -mkdir /user &#xff08;hadoop目录下&#xff09; 多级创建的时候 hdfs dfs -mkdir -p /wifi/classify 查看创…

c语言科学计数法_C入门:C语言中数据的储存(上)

How Data is stored in computer memory?储存数据是计算机进行各种数据操作的基础&#xff0c;为了理解计算机可以对哪些数据进行怎样的操作&#xff0c;有必要了解数据在计算机中的储存方式。为了有效防止失真&#xff0c;提高数据的准确性和稳定性&#xff0c;计算机使用二进…

tf.layers.dense

tf.layers.dense( inputs, units, activationNone, use_biasTrue, kernel_initializerNone, bias_initializertf.zeros_initializer(), kernel_regularizerNone, bias_regularizerNone,activity_regularizerNone, trainableTrue, nameNone, reuseNone ) 各参数含义&#xff1a;…

java 修改 枚举类字段_枚举枚举和修改“最终静态”字段的方法

java 修改 枚举类字段在本新闻通讯中&#xff0c;该新闻通讯最初发表在Java专家的新闻通讯第161期中&#xff0c;我们研究了如何使用sun.reflect包中的反射类在Sun JDK中创建枚举实例。 显然&#xff0c;这仅适用于Sun的JDK。 如果需要在另一个JVM上执行此操作&#xff0c;则您…

tf.reduce_mean

tf.reduce_mean(input_tensor, axisNone, keep_dimsFalse, nameNone, reduction_indicesNone) 作用&#xff1a;沿着张量不同的数轴进行计算平均值。 参数&#xff1a;input_tensor: 被计算的张量&#xff0c;确保为数字类型。 axis: 方向数轴&#xff0c;如果没有…

display函数怎么使用_使用网络构建复杂布局超实用的技巧,赶紧收藏吧

前端开发工程师必读书籍有哪些值得推荐&#xff1f;我们直接进入代码&#xff0c;如下所示&#xff0c;先写些标签&#xff0c;源码在这个链接里面&#xff1a;https://codepen.io/Shadid/pen/zYqNvgvHeader Aside 1 Section Aside 2 Footer在上面&#xff0c;我们创建了一…