题目链接:http://poj.org/problem?id=3264

题目大意:
在给定一堆牛的数量以及其高度的时候,每次给定一段区间,求这个区间内最高的牛和最矮的牛的高度之差为多少。

可以直接利用RMQ求出区间最大最小相减即可,一道模板题- -。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cmath>
  4. #include <algorithm>
  5. #include <iostream>
  6. using namespace std;
  7. #define N 50010
  8.  
  9. int maxn[N][] , minn[N][] , n , q , val[N];
  10.  
  11. void RMQ()
  12. {
  13. memset(maxn , , sizeof(maxn));
  14. memset(minn , 0x3f , sizeof(minn));
  15. for(int i= ; i<=n ; i++) maxn[i][] = minn[i][] = val[i];
  16. for(int i= , j= ; j<=n ; i++ , j<<=){
  17. for(int k= ; k+j-<=n ; k++){
  18. int la = k+(j>>);
  19. maxn[k][i] = max(maxn[k][i-] , maxn[la][i-]);
  20. minn[k][i] = min(minn[k][i-] , minn[la][i-]);
  21. }
  22. }
  23. }
  24.  
  25. int query(int s , int t)
  26. {
  27. int del = t-s+;
  28. int j = (int)(log10(del)/log10())+;
  29. int la = t-(<<(j-))+;
  30. return max(maxn[s][j-] , maxn[la][j-])-min(minn[s][j-] , minn[la][j-]);
  31. }
  32.  
  33. int main()
  34. {
  35. // freopen("in.txt" , "r" , stdin);
  36. while(~scanf("%d%d" , &n , &q))
  37. {
  38. for(int i= ; i<=n ; i++) scanf("%d" , &val[i]);
  39. RMQ();
  40. while(q--){
  41. int s , t;
  42. scanf("%d%d" , &s , &t);
  43. printf("%d\n" , query(s , t));
  44. }
  45. }
  46. return ;
  47. }

RMQ

这道题目用线段树能快速的求解,因为此处不涉及更新,所以无需写update函数

不同于之前只定义一个tree数组,这回我们需要定义一个Max和一个Min数组分别子弟想存放较大和较小值

通过query找到区间内的最大值q,和最小值p,那么q-p便是我们所求的

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. #define N 50005
  8. #define INF 0x3f3f3f3f
  9.  
  10. int height[N],Min[*N],Max[*N],D;
  11.  
  12. int query(int a,int b)
  13. {
  14. int i=D+a-,j=b+D+;
  15. int p=INF,q=;
  16. //if(a==b){return 0;}
  17. for(;i^j^;i>>=,j>>=){
  18. if(~i&){
  19. p=min(p,Min[i^]);
  20. q=max(q,Max[i^]);
  21. }
  22. if(j&){
  23. p=min(p,Min[j^]);
  24. q=max(q,Max[j^]);
  25. }
  26. }
  27. return q-p;
  28. }
  29. int main()
  30. {
  31. int n,Q,a,b;
  32. while(scanf("%d%d",&n,&Q)!=EOF){
  33. memset(Min,,sizeof(Min));
  34. memset(Max,0x3f,sizeof(Max));
  35. for(D=;D<n+;D<<=);
  36. for(int i=;i<=n;i++){
  37. scanf("%d",&height[i]);
  38. Min[D+i]=Max[D+i]=height[i];
  39. }
  40. for(int i=D-;i>=;i--){
  41. Min[i]=min(Min[i<<],Min[i<<|]);
  42. Max[i]=max(Max[i<<],Max[i<<|]);
  43. }
  44. for(int i=;i<=Q;i++){
  45. scanf("%d%d",&a,&b);
  46. printf("%d\n",query(a,b));
  47. }
  48. }
  49. return ;
  50. }

HDU 3264 区间内的最大最小之差的更多相关文章

  1. POJ-3264-Balanced Lineup-线段树模板题-查询区间内最大值和最小值之差

    For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same order. One d ...

  2. hdu 3473 区间条件极值 - 区间 差的绝对值 之和的最小

    题目传送门//res tp hdu 目的 对长度为n的区间,给定q个子区间,求一x,使得区间内所有元素与x的差的绝对值之和最小. 多测. n 1e5 q 1e5 ai [1,1e9] (i∈[1,n] ...

  3. HDU 4417 Super Mario(主席树求区间内的区间查询+离散化)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  4. hdu 4630 查询[L,R]区间内任意两个数的最大公约数

    No Pain No Game Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  5. hdu 4638 树状数组 区间内连续区间的个数(尽可能长)

    Group Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  6. HDU 3709 Balanced Number 求区间内的满足是否平衡的数量 (数位dp)

    平衡数的定义是指,以某位作为支点,此位的左面(数字 * 距离)之和 与右边相等,距离是指某位到支点的距离; 题意:求区间内满足平衡数的数量 : 分析:很好这又是常见的数位dp , 不过不同的是我们这次 ...

  7. hdu 5023(线段树区间染色,统计区间内颜色个数)

    题目描述:区间染色问题,统计给定区间内有多少种颜色? 线段树模板的核心是对标记的处理 可以记下沿途经过的标记,到达目的节点之后一块算,也可以更新的时候直接更新到每一个节点 Lazy操作减少修改的次数( ...

  8. hdu 4283 区间dp

    You Are the One Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  9. hdu3437 划分树 区间内小于第K大的值得和

    Minimum Sum Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tot ...

随机推荐

  1. 基于webmagic的爬虫小应用

    以前没有写过爬虫程序,最近两天就研究了一下java的爬虫框架webmagic.然后写了一个demo 写爬虫的基本思想: 1.抓取目标连接 2.根据页面中标签,抓捕你需要的内容 3.保存结果集 以下是实 ...

  2. mongoDB内置文档定义

    在最近的设计数据库时,犯了一个低级的错误,就是设置内置文档是定义了错误了,导致数据取不出,去找了很多资料都无法解决.最后看了一了一下自己设置的model文件.配置错误,所以导致数据取不出了. 数据库时 ...

  3. sass+compass起步

    前言:Sass is an extension of CSS that adds power and elegance to the basic language. It allows you to ...

  4. phpcms v9模板制作教程

    phpcms v9模板制作教程(转载) 第一节 1.首先下载phpcms v9的集成安装包并安装,这里就不详细说明了. 2.本地调试建议大家使用APMserver,或者wampserver等,可以到P ...

  5. canvas画饼图

    <style> body {    background: black;    text-align: center; } #cans {    background: white; } ...

  6. 【js】js导出表格到excel

    js: function method(tableid) //读取表格中每个单元到EXCEL中 { var curTbl = document.getElementById(tableid); var ...

  7. Quartz使用二 通过属性传递数据

    上一篇介绍了通过context.getJobDetail().getJobDataMap()方式获取传递的数据,其实可以通过定义属性来传递参数 package org.tonny.quartz; im ...

  8. 初用emmet

    下载emmet的pspad插件emmet.js.复制到pspad目录下的 script\JScript 文件夹. 输入 ul#nav>li.item$*4>{Item $} 但是没反应. ...

  9. 浅析 innerHTML 性能优化的原理

    浅析 innerHTML 性能优化的原理 博客分类: web前端 IEAndroidwebkit浏览器UI  昨天看了 lveyo老兄的"innerHTML的性能问题" 一文 ht ...

  10. Mysql无法启动服务解决办法

    只需要输入:mysqld  --initialize 进行初始化,即可启动