当前位置: 首页 > news >正文

RMQ

RMQ是指的是求静态的区间最小值,用暴力可以达到O(n)-O(n)的时间复杂度(O(F1(n))-O(F2(n))指的是用O(F1(n))的时间进行预处理,用O(F2(n))的时间进行1次查询)。可以用线段树做到O(n)-O(logn),具体的过程略去。
这里推荐的是ST算法,可以做到O(nlogn)-O(1)的复杂度。
可以用动态规划的思想解决:设f[i][j]表示从i开始长度为2^j的序列中的最小值,则Dp方程不难求出:

但是如果需要查询的区间长度不是2的幂次方呢?
设查询的区间为[l,r],则我们不难得出:

那么这样就可以实现RMQ了。
程序如下:
#include <cstdio>
#include <iostream>
#include <cmath>

using namespace std;

int a[100010];
int f[100010][20];
int x,y;
int n;

void Init_RMQ()
{
	for(int i=1;i<=n;i++) f[i][0] = a[i];
	for(int j=1;(1<<j)<=n;j++)//预处理 
	{
		for(int i=1;i+(1<<j)-1<=n;i++)
		{
			f[i][j]=min(f[i][j-1],f[i+(1<<(j-1))][j-1]);
		}
	}
}

int Ask_RMQ(int x,int y)
{
	if(x>y) swap(x,y);
	int k = log(y-x+1.0) / log(2.0);
	return min(f[x][k],f[y-(1 << k )+1][k]);
}

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);//输入序列 \
	
	while(scanf("%d%d",&x,&y) && x && y)
		printf("%d\n",Ask_RMQ(x,y));
	
	return 0;
}

我们还可以用笛卡尔树,将RMQ转换为LCA查询,然后用+-1RMQ实现O(n)-O(1)的做法。

转载于:https://www.cnblogs.com/ouqingliang/p/9245323.html

相关文章:

  • 简单聊聊MySQL中的六种日志
  • 网络 基于TCP协议socket编程
  • 最实用的设计模式:策略模式的快速理解
  • Spark算子实战Java版,学到了
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 【设计模式】快速理解装饰者模式,及其在JDK源码中的应用
  • 你真的了解Maven吗?
  • 【转】Xcode常用快捷键与技巧分享
  • 【设计模式】快速理解观察者模式,原来它还有这么多其他名字
  • linux实际应用小技巧
  • 时间类有多复杂,JDK竟设计了三版
  • AOP之PostSharp5-LocationInterceptionAspect
  • 如何快速学习一门新技术
  • 模拟实现部分库函数(strcpy,strcmp,strcat,strstr,memcpy,memmove,memset)
  • 组成原理(一):计算机是如何组成的
  • “大数据应用场景”之隔壁老王(连载四)
  • Docker入门(二) - Dockerfile
  • iOS 颜色设置看我就够了
  • java取消线程实例
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • PHP的Ev教程三(Periodic watcher)
  • Python socket服务器端、客户端传送信息
  • STAR法则
  • 记录一下第一次使用npm
  • 开源SQL-on-Hadoop系统一览
  • 面试遇到的一些题
  • 消息队列系列二(IOT中消息队列的应用)
  • 小而合理的前端理论:rscss和rsjs
  • 再谈express与koa的对比
  • 责任链模式的两种实现
  • 《码出高效》学习笔记与书中错误记录
  • ​520就是要宠粉,你的心头书我买单
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #NOIP 2014# day.1 T2 联合权值
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (pojstep1.1.2)2654(直叙式模拟)
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (转)程序员技术练级攻略
  • *Django中的Ajax 纯js的书写样式1
  • .a文件和.so文件
  • .NET Core 和 .NET Framework 中的 MEF2
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .NET 使用 XPath 来读写 XML 文件
  • .NET 事件模型教程(二)
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET分布式缓存Memcached从入门到实战