一段区间的最值问题,用线段树或RMQ皆可。两种代码都贴上:又是空间换时间。。

RMQ 解法:(8168KB 1625ms)

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <algorithm>
  6. #include <cstdlib>
  7. using namespace std;
  8. #define N 50003
  9.  
  10. int a[N],dmin[N][],dmax[N][],n;
  11.  
  12. void RMQ_init()
  13. {
  14. int i,j;
  15. for(i=;i<=n;i++)
  16. dmin[i][] = dmax[i][] = a[i];
  17. for(j=;(<<j)<=n;j++)
  18. {
  19. for(i=;i+(<<j)-<=n;i++)
  20. {
  21. dmin[i][j] = min(dmin[i][j-],dmin[i+(<<(j-))][j-]);
  22. dmax[i][j] = max(dmax[i][j-],dmax[i+(<<(j-))][j-]);
  23. }
  24. }
  25. }
  26.  
  27. int RMQ(int l,int r)
  28. {
  29. int k = ;
  30. while((<<(k+)) <= r-l+)
  31. k++;
  32. return max(dmax[l][k],dmax[r-(<<k)+][k]) - min(dmin[l][k],dmin[r-(<<k)+][k]);
  33. }
  34.  
  35. int main()
  36. {
  37. int q,i;
  38. while(scanf("%d%d",&n,&q)!=EOF)
  39. {
  40. for(i=;i<=n;i++)
  41. scanf("%d",&a[i]);
  42. RMQ_init();
  43. while(q--)
  44. {
  45. int l,r;
  46. scanf("%d%d",&l,&r);
  47. if(l>r)
  48. swap(l,r);
  49. printf("%d\n",RMQ(l,r));
  50. }
  51. }
  52. return ;
  53. }

线段树解法:(1172KB  2297ms)

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <algorithm>
  6. #include <cstdlib>
  7. using namespace std;
  8. #define N 50003
  9.  
  10. struct node
  11. {
  12. int maxi,mini;
  13. }tree[*N];
  14.  
  15. void pushup(int rt)
  16. {
  17. tree[rt].maxi = max(tree[*rt].maxi,tree[*rt+].maxi);
  18. tree[rt].mini = min(tree[*rt].mini,tree[*rt+].mini);
  19. }
  20.  
  21. void build(int l,int r,int rt)
  22. {
  23. if(l == r)
  24. {
  25. scanf("%d",&tree[rt].maxi);
  26. tree[rt].mini = tree[rt].maxi;
  27. return;
  28. }
  29. int mid = (l+r)/;
  30. build(l,mid,*rt);
  31. build(mid+,r,*rt+);
  32. pushup(rt);
  33. }
  34.  
  35. int query_max(int l,int r,int aa,int bb,int rt)
  36. {
  37. if(aa>r || bb<l)
  38. return -;
  39. if(aa<=l && bb>=r)
  40. return tree[rt].maxi;
  41. int mid = (l+r)/;
  42. return max(query_max(l,mid,aa,bb,*rt),query_max(mid+,r,aa,bb,*rt+));
  43. }
  44.  
  45. int query_min(int l,int r,int aa,int bb,int rt)
  46. {
  47. if(aa>r || bb<l)
  48. return ;
  49. if(aa<=l && bb>=r)
  50. return tree[rt].mini;
  51. int mid = (l+r)/;
  52. return min(query_min(l,mid,aa,bb,*rt),query_min(mid+,r,aa,bb,*rt+));
  53. }
  54.  
  55. int main()
  56. {
  57. int n,q,i;
  58. while(scanf("%d%d",&n,&q)!=EOF)
  59. {
  60. build(,n,);
  61. for(i=;i<=q;i++)
  62. {
  63. int l,r;
  64. scanf("%d%d",&l,&r);
  65. if(l>r)
  66. swap(l,r);
  67. printf("%d\n",query_max(,n,l,r,)-query_min(,n,l,r,));
  68. }
  69. }
  70. return ;
  71. }

POJ 3264 Balanced Lineup -- RMQ或线段树的更多相关文章

  1. POJ - 3264——Balanced Lineup(入门线段树)

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 68466   Accepted: 31752 ...

  2. POJ 3264 Balanced Lineup(zkw线段树)

    [题目链接] http://poj.org/problem?id=3264 [题目大意] 求区间最大值和最小值的差值 [题解] 线段树维护区间极值即可 [代码] #include <cstdio ...

  3. Poj 3264 Balanced Lineup RMQ模板

    题目链接: Poj 3264 Balanced Lineup 题目描述: 给出一个n个数的序列,有q个查询,每次查询区间[l, r]内的最大值与最小值的绝对值. 解题思路: 很模板的RMQ模板题,在这 ...

  4. poj 3264 Balanced Lineup (RMQ)

    /******************************************************* 题目: Balanced Lineup(poj 3264) 链接: http://po ...

  5. POJ - 3264 Balanced Lineup (RMQ问题求区间最值)

    RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,也就 ...

  6. poj 3264 Balanced Lineup (RMQ算法 模板题)

    RMQ支持操作: Query(L, R):  计算Min{a[L],a[L+1], a[R]}. 预处理时间是O(nlogn), 查询只需 O(1). RMQ问题 用于求给定区间内的最大值/最小值问题 ...

  7. POJ 3264 Balanced Lineup RMQ ST算法

    题意:有n头牛,编号从1到n,每头牛的身高已知.现有q次询问,每次询问给出a,b两个数.要求给出编号在a与b之间牛身高的最大值与最小值之差. 思路:标准的RMQ问题. RMQ问题是求给定区间内的最值问 ...

  8. POJ 3264 Balanced Lineup 【ST表 静态RMQ】

    传送门:http://poj.org/problem?id=3264 Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total S ...

  9. poj 3264 Balanced Lineup(线段树、RMQ)

    题目链接: http://poj.org/problem?id=3264 思路分析: 典型的区间统计问题,要求求出某段区间中的极值,可以使用线段树求解. 在线段树结点中存储区间中的最小值与最大值:查询 ...

随机推荐

  1. DigitalOcean上SSH Key的创建(附DigitalOcean邀请)

    DigitalOcean是一家云主机商家,最低配置512M内存,20G的SSD,每月只有5刀.半个月前刚刚在这上面买了一个VPS,创建Droplet的时候看见创建SSH Key的时候就有点懵,不知道这 ...

  2. css导航栏

    几个导航栏也算对学过知识的回顾,总有新的收获,下面是学习过程中敲的代码: <!DOCTYPE HTML> <html> <head> <title>&l ...

  3. andriod arcgis加载影像TIF

    private static final String TAG = "MainActivity"; private MapView mapView = null; @Overrid ...

  4. 【读书笔记】iOS-本地文件和数据安全注意事项

    一,程序文件的安全. 可通过将JavaScript源码时行混淆和加密,防止黑客轻易地阅读和篡改相关的逻辑,也可以防止自己的Web端与Native端的通讯协议泄露. 二,本地数据安全. 对于本地的重要数 ...

  5. 解压缩框架--SSZipArchive

    下载地址:https://github.com/ZipArchive/ZipArchive 如果你直接将框架文件夹拖入项目,构建时会出现以下错误 解决方案: 点击+以后会弹出 如果使用cocoaPod ...

  6. iOS开发基础框架

    ---恢复内容开始--- //appdelegate ////  AppDelegate.m//  iOS开发架构////  Copyright © 2016年 Chason. All rights ...

  7. android 音乐播放器简单实现

    package com.zhangbz.musicplayer; import java.io.File; import android.app.Activity; import android.me ...

  8. XCode升级到7后,规范注释生成器VVDocumenter插件没有用了,怎么办?

    Xcode更新到7之后,发现很多插件包括规范注释生成器VVDocumenter的插件都没法用了,找遍百度都没有找到成功解决这个问题的方法,然后我突发奇想,把注释也弄进代码模板里.虽然没有插件那样灵活: ...

  9. IOS-Swift、Objective-C、C++混合编程

    1.Objective-C调用C++代码 后缀为m文件的是Objective-C的执行文件,而后缀为mm文件的是Objective-C++文件. 直接在Objective-C中是无法调用C++代码的, ...

  10. java集合 之 Collection和Iterator接口

    Collection是List,Queue和Set接口的父接口,该接口里定义的方法即可用于操作Set集合,也可以用于List和Queue集合.Collection接口里定义了如下操作元素的方法. bo ...