• 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. Python与Memcached交互

    Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached ...

  2. 书籍--嵌入式C语言

    1,C语言嵌入式编程修炼 [C/C++]C语言嵌入式编程修炼·背景篇·软件架构篇·内存操作篇

  3. GitHub图形界面使用笔记

    GitHub图形界面使用笔记   学会了最简单的在GitHub上上传项目和展示项目,怕自己会忘记所以还是先记录下了来. GitHub 是一个共享虚拟主机服务,用于存放使用Git版本控制的软件代码和内容 ...

  4. Keras FAQ: 常见问题解答

    Keras官方中文版文档 如何引用 Keras? 如何在 GPU 上运行 Keras? 如何在多 GPU 上运行 Keras 模型? "sample", "batch&q ...

  5. SpringBoot特性

    一.SpringBoot解决的问题 1.使编码变得简单 2.使配置变得简单 3.使部署变得简单 4.使监控变得简单 二.springboot主要特性 1.遵循习惯优于配置的原则.使用springboo ...

  6. ssm框架之将数据库的数据导入导出为excel文件

    在这里首先我要将自己遇到的各种问题,以及需求记录下来,做一个备忘,便于以后查看: 需求:主要实现两个功能,将oracle数据库里的数据导出为excel,同时需要将excel表格的数据导入到数据库 环境 ...

  7. [Luogu3377]【模板】左偏树(可并堆)

    题面戳我 题目描述 如题,一开始有N个小根堆,每个堆包含且仅包含一个数.接下来需要支持两种操作: 操作1: 1 x y 将第x个数和第y个数所在的小根堆合并(若第x或第y个数已经被删除或第x和第y个数 ...

  8. 一个题目涉及到的50个Sql语句

    原博客地址 http://blog.csdn.net/maco_wang/article/details/6281484 Student(S#,Sname,Sage,Ssex) 学生表 Course( ...

  9. iOS开发中常见bug!(内附解答方法)

    序言 你是否曾经修复了一个 bug ,随后又发现了一个跟刚修复 bug 有关的 bug ,又或是修复 bug 的方式引起了另一个 bug ? 然而这些问题是绝佳的学习机会.所以我们怎样尽可能多地从修复 ...

  10. 2017angular、vue、react热度

    中国,过去一年: 中国,过去五年: 全球,过去一年: 全球,过去五年: 其他相关: 数据来源自:Google Trends