RMQ

  今天临放学前终于是学会了RMQ,特此写一篇题解来缅怀

  RMQ是一种数据结构,用途是查询区间内最大值或最小值

或者你所要求的任意条件,主要思想是二进制的思想,其中还用到了dp的思想,

是一种非常不错的算法,在确定左右区间查询上时间复杂度优于线段树

但是NOIP并不常用,也算为后面的LCA打一个基础

  给一道题:

  n个数,m个询问,每次询问区间[L,R]内的最小值。

  思路:我们需要一个二维数组来存储信息,存储方式是dp[i][j]

其中i代表查询的左端点,j为 查询范围 是i+2^j范围内的最小值,数列本身定为a[i]

我们首先确定dp[i][0]一定就是a[i]本身,这是显然的,然后我们需要找出dp转移方程

那方程是什么呢?

  首先我们确定区间为给出的l,r,区间范围就是r-l+1,我们可以将区间

一分为二,然后分别找到左边和右边的最小值,取两值的min值便是区间所求

那我们可以得出结论:dp[i][j]=min(dp[i][j-1],dp[i+(1<<j-1)][j-1])

解释一下,dp[i][j]为从i开始2^j为范围中的最小值,即为我们所求dp[i][j-1]

从i开始2^(j-1)范围内的最小值,是所求范围的前一半

dp[i+(1<<j-1)][j-1] ,从i开始2^(j-1)范围内的最小值,是所求范围的后一半

  然后我们还需要注意一点,就是在预处理dp数组时我们需要将i放在里层

j放在外层,因为我们是以i为开始点进行dp的,在长度为2^j时我们需要把每一个

可出发的i都处理好,所以要将j放在外层

  最后就是区间查询了,我们需要一个值为log2(r-l+1),代表我们的j,这个式子

就是我们还原区间的方式,我们j代表的是2^j,那自然还原就是log2回去了

  代码:

 #include <bits/stdc++.h>
using namespace std;
int n,m,x,y,k;
long long a[];
long long dis[][];
inline void rmq(){
for(register int i=;i<=n;i++) dis[i][]=a[i];
for(register int j=;(<<j)<=n;j++)
for(register int i=;i+(<<j)-<=n;i++)//将i放在里层因为咱们要先更新每一个i的位置关系
dis[i][j]=min(dis[i][j-],dis[i+(<<j-)][j-]);
return;
}
inline void search(int l,int r){
k=log2(r-l+);
printf("%lld\n",min(dis[l][k],dis[r-(<<k)+][k]));
return;
}
int main(){
scanf("%d%d",&n,&m);
for(register int i=;i<=n;i++) scanf("%lld",&a[i]);
rmq();//预处理
for(register int i=;i<=m;i++){
scanf("%d%d",&x,&y);
search(x,y);
}
return ;
}

RMQ

  end;

最新文章

  1. 2013 duilib入门简明教程 -- 部分bug 2 (14)
  2. 【USACO 2.4】Overfencing(bfs最短路)
  3. MongoDB修改器总结
  4. 你真的知道setTimeout是如何运行的吗
  5. java中文乱码解决方法汇总
  6. Why MySQL could be slow with large tables ?
  7. Excel VBA记录
  8. leetcode 88
  9. hadoop优点和缺点
  10. maven自动下载jar包
  11. UESTC_握手 CDOJ 913
  12. linux下查看日志基本命令
  13. HDU 4990 Reading comprehension
  14. 设计模式之“Observer”注疏#01
  15. 通过Nutch扩展点开发插件(添加自定义索引字段到solr)
  16. java操作时间,将当前时间减一年,减一天,减一个月
  17. for循环创建文件夹
  18. linux下用数据泵导入导出(impdp、expdp)
  19. django migrate报错(提前删除表等)
  20. L309 单音节词读音规则(一)-辅音字母发音规则

热门文章

  1. 基础总结篇之二:Activity的四种launchMode (转载)
  2. CoreBluetooth&#160;Central模式&#160;Swift版
  3. 【Codeforces Round #411 (Div. 1)】Codeforces 804C Ice cream coloring (DFS)
  4. poj3069【贪心,水】
  5. hdoj5563(简单几何)
  6. svn项目添加到tomcat后,tomcat无法打开问题解决
  7. 跟我一起玩Win32开发(2):完整的开发流程
  8. MySQL5.5升级到5.6
  9. LVS集群-DR模式
  10. qconbeijing2014