浅谈RMQ
- RMQ是一类求区间极值的问题
- 有一种 \(O\left(nlogn\right)\) 的解法,用倍增实现
倍增算法 变量的定义
- \(A_i\) : 原数组
- \(f_{i,j}\) : 以 \(i\) 为起点(包括 \(i\)),向右 \(2^j\) 个位置的极值,以最大值为例
倍增算法 实现
- 【预处理】
- \(f_{i,0}=A_i\)
- \(f_{i,j}=max\left(f_{i,j-1},f_{i+2^{j-1},j-1}\right)\ (j>0)\)
- 时间复杂度 \(O\left(nlogn\right)\)
for (int j=1,R=log2(n);j<=R;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]);
- 【询问】
- 令 \(x=log_2(r-l+1)\),\(max(f_{l,x},f_{r-2^x+1,x})\)
- 时间复杂度 \(O(1)\)
int Query(int l,int r){
int x=log2(r-l+1);
return max(f[l][x],f[r-(1<<x)+1][x]);
}
当然还有线段树的做法,就是询问时间复杂度是 \(O(logn)\),还能够支持修改
线段树 变量的定义
- \(A_i\) 原数组
- \(tr_i\) 第 \(i\) 个节点
线段树 实现
- 【预处理 建树】
void build(int u,int l,int r){
if (l==r){tr[u]=A[l];return;}
int mid=l+r>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
tr[u]=max(tr[u<<1],tr[u<<1|1]);
}
- 【询问】
int Query(int u,int l,int r,int lx,int rx){
if (l==lx&&r==rx) return tr[u];
int mid=l+r>>1;
if (rx<=mid) return Query(u<<1,l,mid,lx,rx); else
if (mid<lx) return Query(u<<1|1,mid+1,r,lx,rx); else
return max(Query(u<<1,l,mid,lx,mid),Query(u<<1|1,mid+1,r,mid+1,rx));
}
- 【修改】
void modify(int u,int l,int r,int pos,int k){
if (l==r) tr[l]=k;
int mid=l+r>>1;
if (pos<=mid) modify(u<<1,l,mid,pos,k); else
modify(u<<1|1,mid+1,r,pos,k);
tr[u]=max(tr[u<<1],tr[u<<1|1]);
}
浅谈RMQ的更多相关文章
- 浅谈-RMQ
浅谈RMQ Today,我get到了一个新算法,开心....RMQ. 今天主要说一下RMQ里的ST算法(Sparse Table). RMQ(Range Minimum/Maximum Query), ...
- 浅谈 Fragment 生命周期
版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...
- 浅谈 LayoutInflater
浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...
- 浅谈Java的throw与throws
转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...
- 浅谈SQL注入风险 - 一个Login拿下Server
前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...
- 浅谈WebService的版本兼容性设计
在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...
- 浅谈angular2+ionic2
浅谈angular2+ionic2 前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别. 1. 项目所用:angular2+ionic2 ...
- iOS开发之浅谈MVVM的架构设计与团队协作
今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
- Linux特殊符号浅谈
Linux特殊字符浅谈 我们经常跟键盘上面那些特殊符号比如(?.!.~...)打交道,其实在Linux有其独特的含义,大致可以分为三类:Linux特殊符号.通配符.正则表达式. Linux特殊符号又可 ...
随机推荐
- Learning part-based templates from large collections of 3D shapse CorrsTmplt Kim 代码调试
平台: VMware上装的Ubuntu-15.10 环境准备工作:装Fortran, lapack, blas, cblas (理论上装好lapack后面两个应该是自动的),其他的有需要的随时安装就可 ...
- Java开发速度神器Lombok,Eclipse端安装使用教程
一.Lombok简介 Lombok是一个代码生成器,可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法. 使用 ...
- Hibernate【与Spring整合】
前言 前面已经学习了如何使用Spring与Struts2进行整合,本博文主要讲解如何使用Spring对Hibernate进行整合 Spring和Hibernate整合的关键点: SessionFact ...
- JSP页面输出九九乘法表--JSP基础
index.jsp: <%@ page language="java" import="java.util.*" pageEncoding="U ...
- 【LightOJ1282】Leading and Trailing(数论)
[LightOJ1282]Leading and Trailing(数论) 题面 Vjudge 给定两个数n,k 求n^k的前三位和最后三位 题解 这题..真的就是搞笑的 第二问,直接输出快速幂\(m ...
- SPOJ3267:D-query
题面 SPOJ3267 Sol 给定\(N\)个正整数构成的序列,将对于指定的闭区间查询其区间内的不同的数的个数 主席树 不是权值线段树 维护位置 如果插入一个数时发现之前有过了 那么修改当前的,那个 ...
- log4j输出日志到数据库中
1.log4j配置 ###----------------- appender:DATABASE_LOG -----------------#指定输出日志的等级和日志输出范围log4j.logger. ...
- JavaScript 数组基础知识
// Array 类型: // 检测数组: // console.log(myarr instanceof Array) //true // toString()方法会返回由数组中每个值的字符串形式拼 ...
- Learn HTML5 in 5 Minutes!
There's no question, HTML5 is a hot topic for developers. If you need a crash course to quickly unde ...
- 封装Jquery 合并table中任何同列数据
封装代码: jQuery.fn.rowspan = function (colIdx) { //封装JQuery同列值相同合并小插件 return this.each(function () { va ...