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

典型RMQ,这道题被我鞭尸了三遍也是醉了…这回用新学的st算法。

st算法本身是一个区间dp,利用的性质就是相邻两个区间的最值的最值一定是这两个区间合并后的最值,这条性质决定了这个dp子问题的重叠。可以利用这个性质预处理出这张表,只不过步长是2的幂次。

查询的时候也是如此,但是未必会精准地选中两个区间,不要紧,因为两个区间重叠的部分也会被自动算在求最值的内部。这个时候如果算的是区间和的话,要减去这一部分。(区间和的话直接用前缀和不就好了嘛)

  1. /*
  2. ━━━━━┒ギリギリ♂ eye!
  3. ┓┏┓┏┓┃キリキリ♂ mind!
  4. ┛┗┛┗┛┃\○/
  5. ┓┏┓┏┓┃ /
  6. ┛┗┛┗┛┃ノ)
  7. ┓┏┓┏┓┃
  8. ┛┗┛┗┛┃
  9. ┓┏┓┏┓┃
  10. ┛┗┛┗┛┃
  11. ┓┏┓┏┓┃
  12. ┛┗┛┗┛┃
  13. ┓┏┓┏┓┃
  14. ┃┃┃┃┃┃
  15. ┻┻┻┻┻┻
  16. */
  17. #include <algorithm>
  18. #include <iostream>
  19. #include <iomanip>
  20. #include <cstring>
  21. #include <climits>
  22. #include <complex>
  23. #include <fstream>
  24. #include <cassert>
  25. #include <cstdio>
  26. #include <bitset>
  27. #include <vector>
  28. #include <deque>
  29. #include <queue>
  30. #include <stack>
  31. #include <ctime>
  32. #include <set>
  33. #include <map>
  34. #include <cmath>
  35. using namespace std;
  36. #define fr first
  37. #define sc second
  38. #define cl clear
  39. #define BUG puts("here!!!")
  40. #define W(a) while(a--)
  41. #define pb(a) push_back(a)
  42. #define Rint(a) scanf("%d", &(a))
  43. #define Rll(a) scanf("%lld", &a)
  44. #define Rs(a) scanf("%s", a)
  45. #define Cin(a) cin >> a
  46. #define FRead() freopen("in", "r", stdin)
  47. #define FWrite() freopen("out", "w", stdout)
  48. #define Rep(i, len) for(int i = 0; i < (len); i++)
  49. #define For(i, a, len) for(int i = (a); i < (len); i++)
  50. #define Cls(a) memset((a), 0, sizeof(a))
  51. #define Clr(a, x) memset((a), (x), sizeof(a))
  52. #define Full(a) memset((a), 0x7f, sizeof(a))
  53. #define lrt rt << 1
  54. #define rrt rt << 1 | 1
  55. #define pi 3.14159265359
  56. #define RT return
  57. #define lowbit(x) x & (-x)
  58. #define onenum(x) __builtin_popcount(x)
  59. typedef long long LL;
  60. typedef long double LD;
  61. typedef unsigned long long Uint;
  62. typedef pair<int, int> pii;
  63. typedef pair<LL, LL> pLL;
  64. typedef pair<string, LL> psi;
  65. typedef map<string, LL> msi;
  66. typedef vector<LL> vi;
  67. typedef vector<LL> vl;
  68. typedef vector<vl> vvl;
  69. typedef vector<bool> vb;
  70.  
  71. const int maxn =;
  72. int n, q;
  73. int h[maxn];
  74. int dp[maxn][][];
  75.  
  76. void st() {
  77. for(int i = ; i <= n; i++) dp[i][][] = dp[i][][] = h[i];
  78. for(int j = ; ( << j) <= n; j++) {
  79. for(int i = ; i + ( << j) - <= n; i++) {
  80. dp[i][j][] = min(dp[i][j-][], dp[i+(<<(j-))][j-][]);
  81. dp[i][j][] = max(dp[i][j-][], dp[i+(<<(j-))][j-][]);
  82. }
  83. }
  84. }
  85.  
  86. int query(int l, int r) {
  87. int j = ;
  88. while(( << (j + )) <= r - l + ) j++;
  89. return max(dp[l][j][], dp[r-(<<j)+][j][]) - min(dp[l][j][], dp[r-(<<j)+][j][]);
  90. }
  91.  
  92. int main() {
  93. // FRead();
  94. while(~scanf("%d%d",&n,&q)) {
  95. For(i, , n+) Rint(h[i]);
  96. st();
  97. int l, r;
  98. W(q) {
  99. scanf("%d%d",&l,&r);
  100. printf("%d\n",query(l,r));
  101. }
  102. }
  103. RT ;
  104. }

[POJ3264]Balanced Lineup(RMQ, ST算法)的更多相关文章

  1. POJ 3264 Balanced Lineup RMQ ST算法

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

  2. POJ3264 Balanced Lineup [RMQ模板]

    题意:有n头牛,输入他们的身高,求某区间身高的极值的差(max-min), 用RMQ模板,同时构造求极大值和极小值的两个数组. //poj3264 #include <iostream> ...

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

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

  4. 求解区间最值 - RMQ - ST 算法介绍

    解析 ST 算法是 RMQ(Range Minimum/Maximum Query)中一个很经典的算法,它天生用来求得一个区间的最值,但却不能维护最值,也就是说,过程中不能改变区间中的某个元素的值.O ...

  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模板

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

  7. poj 3264 Balanced Lineup (RMQ)

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

  8. POJ3264 Balanced Lineup

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 44720   Accepted: 20995 ...

  9. 【洛谷】P2880 [USACO07JAN]平衡的阵容Balanced Lineup(st表)

    题目背景 题目描述: 每天,农夫 John 的N(1 <= N <= 50,000)头牛总是按同一序列排队. 有一天, John 决定让一些牛们玩一场飞盘比赛. 他准备找一群在对列中为置连 ...

随机推荐

  1. html公用库

    <script src="http://lib.sinaapp.com/js/jquery/1.6/jquery.min.js" language="javascr ...

  2. Binary Indexed Tree 2D 分类: ACM TYPE 2014-09-01 08:40 95人阅读 评论(0) 收藏

    #include <cstdio> #include <cstdlib> #include <climits> #include <cstring> # ...

  3. 父页面 调用iframe方法

      父页面调用Iframe的方法 document.getElementById("tabIf0").contentWindow.Search();     Jquery 方式: ...

  4. 用c语言产生随机数的方法

    用c语言产生随机数的方法 在C语言中,rand()函数可以用来产生随机数,但是这不是真正意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列 ...

  5. PowerDesigner(三)-企业架构模型(转)

    企业架构模型(Enterprise Architecture Model,EAM)是PowerDesigner 15新增的功能,它能够以图形的方式展现企业架构,从而取代文字描述:以偏向非技术性的表达方 ...

  6. HTML5中表单验证的8种方法(转)

    在深人探讨表单验证之前,让我们先思考一下表单验证的真实含义.就其核心而言,表单验证是一套系统,它为终端用户检测无效的控件数据并标记这些错误.换言之,表单验证就是在表单提交服务器前对其进行一系列的检查并 ...

  7. Keil RTX systick 初始化

    在STM32F215上移植Keil的RTX操作系统,随便设置下就能好使,但是当我想知道systick到底是怎么设置的时候,就得翻翻代码了,原来在 rt_HAL_CM.h中以一个内联函数的形式定义的 _ ...

  8. XHProf的安装和使用(PHP性能测试神器)

    XHProf是Facebook开发的性能调试工具,帮助我们的PHP程序性能调优,更加健壮.XHProf安装和使用方法将在本章讲解.XHProf是PHP的PECL扩展.没有XDeBug那些耗费资源,更加 ...

  9. 报名|「OneAPM x DaoCloud」技术公开课:Docker性能监控!

    如今,越来越多的公司开始 Docker 了,「三分之二的公司在尝试了 Docker 后最终使用了它」,也就是说 Docker 的转化率达到了 67%,同时转化时长也控制在 60 天内. 既然 Dock ...

  10. 后缀树系列一:概念以及实现原理( the Ukkonen algorithm)

    首先说明一下后缀树系列一共会有三篇文章,本文先介绍基本概念以及如何线性时间内构件后缀树,第二篇文章会详细介绍怎么实现后缀树(包含实现代码),第三篇会着重谈一谈后缀树的应用. 本文分为三个部分, 首先介 ...