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

思路分析:

典型的区间统计问题,要求求出某段区间中的极值,可以使用线段树求解。

在线段树结点中存储区间中的最小值与最大值;查询时使用线段树的查询

方法并稍加修改即可进行查询区间中最大与最小值的功能。

代码(线段树解法):

  1. #include <limits>
  2. #include <cstdio>
  3. #include <iostream>
  4. using namespace std;
  5.  
  6. const int MAX_N = ;
  7. const int N_VAL = + ;
  8. struct SegTreeNode
  9. {
  10. int valMin, valMax;
  11. };
  12.  
  13. SegTreeNode segTree[MAX_N];
  14. int val[N_VAL];
  15. int valMax, valMin;
  16.  
  17. int Max(int a, int b) { return a > b ? a : b; }
  18. int Min(int a, int b) { return a > b ? b : a; }
  19. void Build(int root, int nbegin, int nend, int arr[])
  20. {
  21. if (nbegin == nend)
  22. {
  23. segTree[root].valMax = arr[nbegin];
  24. segTree[root].valMin = arr[nbegin];
  25. }
  26. else
  27. {
  28. int mid = (nbegin + nend) / ;
  29.  
  30. Build( * root, nbegin, mid, arr);
  31. Build( * root + , mid + , nend, arr);
  32. segTree[root].valMax = Max(segTree[ * root].valMax, segTree[ * root + ].valMax);
  33. segTree[root].valMin = Min(segTree[ * root].valMin, segTree[ * root + ].valMin);
  34. }
  35. }
  36.  
  37. void Query(int root, int nbegin, int nend, int qbegin, int qend)
  38. {
  39. if (nbegin > qend || nend < qbegin)
  40. return;
  41. if (qbegin <= nbegin && qend >= nend)
  42. {
  43. if (valMax < segTree[root].valMax)
  44. valMax = segTree[root].valMax;
  45. if (valMin > segTree[root].valMin)
  46. valMin = segTree[root].valMin;
  47. return;
  48. }
  49.  
  50. int mid = (nbegin + nend) / ;
  51.  
  52. Query( * root, nbegin, mid, qbegin, qend);
  53. Query( * root + , mid + , nend, qbegin, qend);
  54. }
  55.  
  56. int main()
  57. {
  58. int qbegin, qend;
  59. int count = , N, Q;
  60.  
  61. scanf("%d%d", &N, &Q);
  62. while (count++ < N)
  63. scanf("%d", &val[count]);
  64.  
  65. Build(, , N, val);
  66. while (Q--)
  67. {
  68. valMax = INT_MIN, valMin = INT_MAX;
  69. scanf("%d%d", &qbegin, &qend);
  70. Query(, , N, qbegin, qend);
  71. printf("%d\n", valMax - valMin);
  72. }
  73.  
  74. return ;
  75. }

代码(RMQ解法):

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <iostream>
  4. using namespace std;
  5.  
  6. const int MAX_L = ;
  7. const int MAX_N = + ;
  8. int height[MAX_N];
  9. int max_h[MAX_N][MAX_L], min_h[MAX_N][MAX_L];
  10.  
  11. void RmqMaxInit(int n)
  12. {
  13. for (int j = ; j < MAX_L; ++j)
  14. {
  15. for (int i = ; i < n; ++i)
  16. {
  17. if (j == )
  18. max_h[i][j] = height[i];
  19. else
  20. {
  21. max_h[i][j] = max_h[i][j - ];
  22. int p = i + ( << (j - ));
  23. if (p < n)
  24. {
  25. if (max_h[p][j - ] > max_h[i][j])
  26. max_h[i][j] = max_h[p][j - ];
  27. }
  28. }
  29. }
  30. }
  31. }
  32.  
  33. int RmqMaxQuery(int l, int r)
  34. {
  35. if (l > r)
  36. {
  37. int temp = l;
  38. l = r;
  39. r = temp;
  40. }
  41. int k = log(r - l + ) / log();
  42. return max_h[l][k] > max_h[r - ( << k) + ][k] ?
  43. max_h[l][k] : max_h[r - ( << k) + ][k];
  44. }
  45.  
  46. void RmqMinInit(int n)
  47. {
  48. for (int j = ; j < MAX_L; ++j)
  49. {
  50. for (int i = ; i < n; ++i)
  51. {
  52. if (j == )
  53. min_h[i][j] = height[i];
  54. else
  55. {
  56. min_h[i][j] = min_h[i][j - ];
  57. int p = i + ( << (j - ));
  58. if (p < n)
  59. {
  60. if (min_h[p][j - ] < min_h[i][j])
  61. min_h[i][j] = min_h[p][j - ];
  62. }
  63. }
  64. }
  65. }
  66. }
  67.  
  68. int RmqMinQuery(int l, int r)
  69. {
  70. if (l > r)
  71. {
  72. int temp = l;
  73. l = r;
  74. r = temp;
  75. }
  76.  
  77. int k = log(r - l + ) / log();
  78. return min_h[l][k] < min_h[r - ( << k) + ][k] ?
  79. min_h[l][k] : min_h[r - ( << k) + ][k];
  80. }
  81.  
  82. int main()
  83. {
  84. int num_len, query_num;
  85.  
  86. scanf("%d %d", &num_len, &query_num);
  87. for (int i = ; i < num_len; ++i)
  88. scanf("%d", &height[i]);
  89. RmqMaxInit(num_len);
  90. RmqMinInit(num_len);
  91.  
  92. for (int i = ; i < query_num; ++i)
  93. {
  94. int l = , r = ;
  95. int min_height = , max_height = ;
  96.  
  97. scanf("%d %d", &l, &r);
  98. max_height = RmqMaxQuery(l - , r - );
  99. min_height = RmqMinQuery(l - , r - );
  100. printf("%d\n", max_height - min_height);
  101. }
  102.  
  103. return ;
  104. }

poj 3264 Balanced Lineup(线段树、RMQ)的更多相关文章

  1. POJ 3264 Balanced Lineup 线段树RMQ

    http://poj.org/problem?id=3264 题目大意: 给定N个数,还有Q个询问,求每个询问中给定的区间[a,b]中最大值和最小值之差. 思路: 依旧是线段树水题~ #include ...

  2. [POJ] 3264 Balanced Lineup [线段树]

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 34306   Accepted: 16137 ...

  3. POJ 3264 Balanced Lineup 线段树 第三题

    Balanced Lineup Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line ...

  4. POJ 3264 Balanced Lineup (线段树)

    Balanced Lineup For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the s ...

  5. POJ - 3264 Balanced Lineup 线段树解RMQ

    这个题目是一个典型的RMQ问题,给定一个整数序列,1~N,然后进行Q次询问,每次给定两个整数A,B,(1<=A<=B<=N),求给定的范围内,最大和最小值之差. 解法一:这个是最初的 ...

  6. 【POJ】3264 Balanced Lineup ——线段树 区间最值

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 34140   Accepted: 16044 ...

  7. poj 3264 Balanced Lineup 区间极值RMQ

    题目链接:http://poj.org/problem?id=3264 For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) alw ...

  8. Poj 3264 Balanced Lineup RMQ模板

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

  9. POJ 3264 Balanced Lineup【线段树区间查询求最大值和最小值】

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 53703   Accepted: 25237 ...

随机推荐

  1. SSH框架的简化

    ---恢复内容开始--- 一.简易化的SSH框架,如图: SSH框架的搭建,我就不多说了. 二.简易的ssh框架的步骤: 1.重新编写applicationContext.xmlwen文件 <一 ...

  2. Hive和Jdbc示例

    重要:在使用 JDBC 开发 Hive 程序时, 必须首先开启 Hive 的远程服务接口.使用下面命令进行开启:hive -service hiveserver & 1). 测试数据 user ...

  3. 纯JS URL编解码

    function urlEncode(str) { var ret = ""; var strSpecial = "!\"#$%&’()*+,/:;&l ...

  4. js函数绑定同时,如何保留代码执行环境?

    经常写js的程序员一定不会对下面这段代码感到陌生. var EventUtil = { addHandler : function(element, type, handler){ if(elemen ...

  5. Ie浏览器TextBox文本未居中

    Ie浏览器TextBox文本未居中,而其他浏览器无问题时,可能原因是未设置垂直居中  vertical-align:middle

  6. StringBuffer&Runtime demo

    public class StringBufferDemo02 {     public static void main(String[] args) {         StringBuffer ...

  7. mysqldump 利用rr隔离实现一致性备份

    mysqldump -p -S /data/mysqldata1/sock/mysql.sock --single-transaction --master-data=2 --database db1 ...

  8. Jsoup代码解读之四-parser

    Jsoup代码解读之四-parser 作为Java世界最好的HTML 解析库,Jsoup的parser实现非常具有代表性.这部分也是Jsoup最复杂的部分,需要一些数据结构.状态机乃至编译器的知识.好 ...

  9. 对开发中常见的内存泄露,GDI泄露进行检测

    对开发中常见的内存泄露,GDI泄露进行检测 一.GDI泄露检测方法: 在软件测试阶段,可以通过procexp.exe 工具,或是通过任务管理器中选择GDI对象来查看软件GDI的对象是使用情况. 注意点 ...

  10. VS2010/MFC常用控件:图片控件Picture Control

    图片控件Picture Control 本节主要讲一种简单实用的控件,图片控件Picture Control.我们可以在界面某个位置放入图片控件,显示图片以美化界面. 图片控件简介 图片控件和前面讲到 ...