问题类型:是多次询问一个大区间里子区间的最值问题

dp + 位运算的思想处理

rmax[i][j]表示从i开始到i + 2^j - 1的区间里的最大值
dp[i][j] ==== (i,i + 2^j - 1)
分为

dp[i][j-1] === (i,i + 2^(j-1) - 1)
dp[i + 1 << (j-1))][j-1] === (i + 2^(j-1),i + 2^j - 1)

所以初始处理就比较明显了

int rmax[maxn][20];
int rmin[maxn][20];
int a[maxn];
int n,m;
void rmq(int flag)
{
for(int i = 1;i <= n;i++)
{
rmax[i][0] = rmin[i][0] = a[i];
}
for(int j = 1;(1 << j) <= n;j++)
{
for(int i = 1;i + (1 << j) - 1 <= n;i++)
{
if(flag)
rmax[i][j] = max(rmax[i][j-1],rmax[i + (1 << (j-1))][j-1]);
else
rmin[i][j] = min(rmin[i][j-1],rmin[i+(1<<(j-1))][j-1]);
}
}
}

外层循环是跨度,很明显,因为他是基础

查询算法,求出最小分割区间k,覆盖l,r

int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i = 1;i <= n;i++)
scanf("%d",&a[i]);
rmq(1);
rmq(0);
int l,r;
for(int i = 1;i <= m;i++)
{
scanf("%d%d",&l,&r);
int k = 0;
while(1 << (k + 1) <= r - l + 1)
k++;
int ansmax = max(rmax[l][k] , rmax[r - (1 << k) + 1][k]);
int ansmin = min(rmin[l][k] , rmin[r - (1 << k) + 1][k]);
printf("%d\n",ansmax - ansmin);
}
}
return 0;
}

RMQ算法区间最值的更多相关文章

  1. RMQ求区间最值 nlog(n)

    转载于:http://blog.csdn.net/xuzengqiang/article/details/7350465 RMQ算法全称为(Range Minimum/Maximum Query)意思 ...

  2. 【RMQ】 区间最值查询详解

    1. 概述 RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A ...

  3. 基于稀疏表(Sparse Table)的RMQ(区间最值问题)

    在RMQ的其他实现方法中,有一种叫做ST的算法比较常见. [构建] dp[i][j]表示的是从i起连续的2j个数xi,xi+1,xi+2,...xi+2j-1( 区间为[i,i+2j-1] )的最值. ...

  4. ST表 求 RMQ(区间最值)

    RMQ即Range Minimum/Maximun Query,中文意思:查询一个区间的最小值/最大值 比如有这样一个数组:A{3 2 4 5 6 8 1 2 9 7},然后问你若干问题: 数组A下标 ...

  5. hdu3183 rmq求区间最值的下标

    两个月前做的题,以后可以看看,是rmq关于求区间最值的下标 /* hdu3183 终点 给一个整数,可以删除m位,留下的数字形成一个新的整数 rmq 取n-m个数,使形成的数最小 */ #includ ...

  6. RMQ st算法 区间最值模板

    #include<bits/stdc++.h> ; ; int f[N][Logn],a[N],lg[N],n,m; int main(){ cin>>n>>m; ...

  7. 【模板】 RMQ求区间最值

    RMQ RMQ简单来说就是求区间的最大值(最小值) 核心算法:动态规划 RMQ(以下以求最大值为例) F[i,j]表示 从 i 开始 到i+2j -1这个区间中的最大值 状态转移方程 F[i,j]=m ...

  8. HDU 5289 Assignment (ST算法区间最值+二分)

    题目链接:pid=5289">http://acm.hdu.edu.cn/showproblem.php?pid=5289 题面: Assignment Time Limit: 400 ...

  9. nyoj 119士兵杀敌(三)(线段树区间最值查询,RMQ算法)

    题目119 题目信息 执行结果 本题排行 讨论区 士兵杀敌(三) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5 描写叙述 南将军统率着N个士兵,士兵分别编号为1~N,南将军常 ...

随机推荐

  1. nodejs 开发服务端 child_process 调试方法(1)

    由于最近正在做一个服务端项目,采用了nodejs引擎开发,主要是master-worker工作机制;主进程可以直接调试,但是子进程调试好像有点麻烦,我没有找到好的方法; worker这里,我分拆成了几 ...

  2. UI设计课程教程分享:Banner的设计和技巧

    Banner是一个网站的中心主题,可以从banner看出网站的内容.所以一个好的banner对网站的影响很大. 提高banner的制作从几点深入了解:文字排版.选择适合的图片及背景.颜色的用法. 一. ...

  3. PHP数组对象互转

    //数组转对象 function array2object($array) { if (is_array($array)) { $obj = new StdClass(); foreach ($arr ...

  4. mysql bigint ,int , smallint,tinyint 的范围

    bigint  8字节 64位 int 4字节 32位 smallint 2字节 16位 tinyint 1字节8位 .. 范围  -128 到 127  , 如果是无符号 ,则返回 位 0-255 ...

  5. windows mysql 主从热备

    环境说明:   Master:192.168.1.200 Slave:192.168.1.210     MySQL 的 Master 配置:   配置my.ini:   [mysqld]   # T ...

  6. 【UI测试】--快捷键组合

  7. Java SE学习【二】——面向对象

    面向对象的学习也进行了一段时间,这段时间学了,类和对象:属性:方法:封装:继承:多态:接口.也算是有一些自己的理解,不愧是贴近人类思维的思想,老师讲时我常常会想到以前的一些事物和其交相印证,其中最常想 ...

  8. Asterisk 的安全性

      設置 Asterisk 的安全性 (security) 转载http://www.osslab.com.tw/index.php?title=VoIP/IP_PBX/%E8%BB%9F%E9%AB ...

  9. 之前的一些Oracle的经验总结

    1. 安装: 1) 关于字符集的选择,现在还不很了解,修改是需要进入一个模式下才可以修改,当然新建一个数据库实例的时候可以重新设定: UTF8是相对比较大的一个字符集, 可以简单实用这个就能保存很多的 ...

  10. 数组方法indexOf & lastIndexOf

    indexOf() 语法:arrayObject.indexOf(searchvalue, startIndex) 功能:从数组的开头(位置0)开始向后查找. 参数:searchvalue:必需,要查 ...