浅谈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特殊符号又可 ...
随机推荐
- 自定义方法实现ArrayList排序
package cn.edu.nwpu.java; import java.util.ArrayList; import java.util.Collection; import com.sun.xm ...
- 通过ApplicationContext.getBean(beanName)动态加载数据。
一,前台数据 $.ajax({ url: '/intra/coe/order/ploadTable.htm', type: 'POST', dataType: 'json', data: {keyId ...
- 【转】Java中hashCode的作用
以下是关于HashCode的官方文档定义: hashcode方法返回该对象的哈希码值.支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表. hashCode ...
- PortableApps使用入门
PortableApps使用入门 Software 介绍 添加软件 绿软下载站推荐 介绍 官网:http://portableapps.com/ PortableApps作为一款卓越的绿软管理软件,它 ...
- 主流nosql数据库对比
目前开源的NOSQL数据库有,Redis,Tokyo Cabinet,Cassandra,Voldemort,MongoDB,Dynomite,HBase,CouchDB,Hypertable, Ri ...
- iOS 双击tabbar刷新页面
/*在继承UITabBarController控制器中*/ #pragma mark <UITabBarControllerDelegate> -(void)tabBarControlle ...
- 第十一篇:Map/Reduce 工作机制分析 - 错误处理机制
前言 对于Hadoop集群来说,节点损坏是非常常见的现象. 而Hadoop一个很大的特点就是某个节点的损坏,不会影响到整个分布式任务的运行. 下面就来分析Hadoop平台是如何做到的. 硬件故障 硬件 ...
- 【BZOJ1003】物流运输(动态规划,最短路)
[BZOJ1003]物流运输(动态规划,最短路) 题面 Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司 ...
- [APIO2009]抢掠计划
题面: Description Siruseri城中的道路都是单向的.不同的道路由路口连接.按照法律的规定,在每个路口都设立了一个Siruseri银行的ATM取款机.令人奇怪的是,Siruseri的酒 ...
- Git基本命令 -- 创建Git项目
在这里下载git:https://git-scm.com/ 安装的时候, 如果是windows系统的话, 可以勾选unix的命令行工具, 这样在windows命令行下会多出很多命令, 例如ls. Gi ...