• 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的更多相关文章

  1. 浅谈-RMQ

    浅谈RMQ Today,我get到了一个新算法,开心....RMQ. 今天主要说一下RMQ里的ST算法(Sparse Table). RMQ(Range Minimum/Maximum Query), ...

  2. 浅谈 Fragment 生命周期

    版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...

  3. 浅谈 LayoutInflater

    浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...

  4. 浅谈Java的throw与throws

    转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...

  5. 浅谈SQL注入风险 - 一个Login拿下Server

    前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...

  6. 浅谈WebService的版本兼容性设计

    在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...

  7. 浅谈angular2+ionic2

    浅谈angular2+ionic2   前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别.   1. 项目所用:angular2+ionic2 ...

  8. iOS开发之浅谈MVVM的架构设计与团队协作

    今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...

  9. Linux特殊符号浅谈

    Linux特殊字符浅谈 我们经常跟键盘上面那些特殊符号比如(?.!.~...)打交道,其实在Linux有其独特的含义,大致可以分为三类:Linux特殊符号.通配符.正则表达式. Linux特殊符号又可 ...

随机推荐

  1. Flex中创建Accordion报错

    1.错误描述 2.错误原因 <mx:Accordion width="100%" height="100%"> <s:NavigatorCon ...

  2. windows共享虚拟机ubuntu目录

    1)安装 sudo apt-get install samba 2)配置文件vi /etc/samba/smb.conf 添加如下 3)启动服务 sudo service smbd start 4)w ...

  3. 谈谈MySQL的事务隔离级别

    这篇文章能够阐述清楚跟数据库相关的四个概念:事务.数据库读现象.隔离级别.锁机制 一.事务 先来看下百度百科对数据库事务的定义: 作为单个逻辑单元执行一系列操作,要么完全执行,要么完全不执行.事务处理 ...

  4. CF484E Sign on Fence

    题意 给定一个长度为n的数列,有m次询问,询问形如l r k 要你在区间[l,r]内选一个长度为k的区间,求区间最小数的最大值 Sol 二分答案 怎么判定,每种数字开一棵线段树 某个位置上的数大于等于 ...

  5. java支付宝开发-01-沙箱环境接入

    一.沙箱环境说明 (1)蚂蚁沙箱环境(Beta)是协助开发者进行接口功能开发及主要功能联调的辅助环境.沙箱环境模拟了开放平台部分产品的主要功能和主要逻辑(当前沙箱支持产品请参考“沙箱支持产品列表”). ...

  6. 解决Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project autotest_fchtgl: Compilation failure的方法

    在碰到maven install 发现报错 Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.2:comp ...

  7. Intellij +Maven 报错: Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME environment variable and mvn script match.

    在intellij使用 Maven Project 测试时,运行test时看到log里的报错信息: -Dmaven.multiModuleProjectDirectory system propert ...

  8. Git分支(1/5) -- 基本命令

    把所有的变化都放在master分支并不是最好的做法. 建议的做法是把变化放在分支里面. 至少应该准备一个feature分支之类的, 把变化都隔离开来, 然后等到所有的功能都稳定之后再合并到master ...

  9. Python基础-week04

    本节内容摘要:#Author:http://www.cnblogs.com/Jame-mei 装饰器 迭代器&生成器 Json & pickle 数据序列化 软件目录结构规范 作业:A ...

  10. PHP教程-防止网站被刷票的小技巧

    在Web开发中,投票模块会经常出现.这样就使得防止刷票,成了至关重要的技术.以下是兄弟连教育www.itxdl.cn总结的一些防止刷票方法: 1. IP限制 这是使用的最多,也是最广泛,不可少的刷票限 ...