Description
For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same order. One day Farmer John decides to organize a game of Ultimate Frisbee with some of the cows. To keep things simple, he will take a contiguous range of cows from the milking lineup to play the game. However, for all the cows to have fun they should not differ too much in height.
Farmer John has made a list of Q (1 ≤ Q ≤ 200,000) potential groups of cows and their heights (1 ≤ height ≤ 1,000,000). For each group, he wants your help to determine the difference in height between the shortest and the tallest cow in the group.
Input
Line 1: Two space-separated integers, N and Q.
Lines 2..N+1: Line i+1 contains a single integer that is the height of cow i
Lines N+2..N+Q+1: Two integers A and B (1 ≤ A ≤ B ≤ N), representing the range of cows from A to B inclusive.
Output
Lines 1..Q: Each line contains a single integer that is a response to a reply and indicates the difference in height between the tallest and shortest cow in the range.
Sample Input
6 3
1
7
3
4
2
5
1 5
4 6
2 2
Sample Output
6
3

0

这道题裸考范围最值问题,题意给定一些数,给一个区间求这个区间最大值与最小值的差。

RMQ详解:

范围最小值问题(Range Minimum Query,RMQ)。给一个 n 个元素的数组A1,A2,...,An,查询范围(L,R)中的最小值和最大值。

Sparse-Table算法,它预处理时间O(nlogn),但查询只需O(1)。
令 d(i, j) 表示从 i 开始,长度为 2^j 的一段元素中的最小值,则状态转移:d( i , j ) = min{ d( i , j - 1 ), d(i + 2^( j - 1) , j - 1 )},原理如下图:

注意2^j <= n,因此 d 数组的元素个数不超过 nlogn ,而每一项都可以在常数时间计算完毕,故总时间为O(nlogn)。

预处理代码:

void RMQ_init(const vector<int>& A)
{int n = A.size();for (int i = 0; i < n; i++)d[i][0] = A[i];  //初始化for (int j = 1; (1 << j) <= n; j++)     for (int i = 0; i + (1 << j) - 1 <n; i++)  ///i从0开始保证了区间的无缝覆盖d[i][j] = min(d[i][j - 1], d[i + (1 << (j - 1))][j - 1]);
}

查询时,令 k 为满足 2^k <= R - L + 1 的最大整数,则以 L 开头,以 R 结尾的两个长度为2^k 的区间合起来即覆盖了查询区间[L , R]。由于是取最值,有些元素重复了也没关系。

        

查询代码:

 int RMQ(int L, int R)
{  int k = 0;  while ((1 << (k + 1)) <= R - L + 1) k++;  <span style="font-family: Arial, Helvetica, sans-serif;">///如果2^(k+1)<=R-L+1,那么看还可以加1</span>return  min(d[L][k], d[R - (1 << k) + 1][k]);
}      

本题代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#define N 50000+10
using namespace std;
int dmax[N][16],dmin[N][16];///2^16>N
vector<int>Q;
void RMQ_init(const vector<int>& A)
{int n = A.size();for (int i = 0; i < n; i++)dmax[i][0]=dmin[i][0]= A[i];  //初始化for (int j = 1; (1 << j) <= n; j++)for (int i = 0; i + (1 << j) - 1 <n; i++)  ///i从0开始保证了区间的无缝覆盖{dmax[i][j] = max(dmax[i][j - 1], dmax[i + (1 << (j - 1))][j - 1]);dmin[i][j] = min(dmin[i][j - 1], dmin[i + (1 << (j - 1))][j - 1]);}
}
int RMQ_max(int L, int R)
{int k = 0;while ((1 << (k + 1)) <= R - L + 1) k++;///如果2^(k+1)<=R-L+1,那么看还可以加1return  max(dmax[L][k], dmax[R - (1 << k) + 1][k]);
}
int RMQ_min(int L, int R)
{int k = 0;while ((1 << (k + 1)) <= R - L + 1) k++;return  min(dmin[L][k], dmin[R - (1 << k) + 1][k]);
}int main()
{int n,m,i,a,L,R;while(~scanf("%d%d",&n,&m)){for(i=0; i<n; i++){scanf("%d",&a);Q.push_back(a);}RMQ_init(Q);while(m--){scanf("%d%d",&L,&R);printf("%d\n",RMQ_max(L-1,R-1)-RMQ_min(L-1,R-1));///预处理是从0开始的,所以区间边界都减一}}
}

POJ 3264 Balanced Lineup (RMQ)相关推荐

  1. poj 3264 Balanced Lineup RMQ问题 线段树

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

  2. POJ 3264 Balanced Lineup(RMQ)

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 24349   Accepted: 11348 ...

  3. POJ 3264 Balanced Lineup

    POJ 3264 Balanced Lineup 题目链接 Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,00 ...

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

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

  5. POJ 3264 Balanced Lineup

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 53629   Accepted: 25223 ...

  6. POJ 3264 Balanced Lineup 【线段树】

    Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 50004 Accepted: 23434 Cas ...

  7. 【RMQ】POJ 3264 Balanced Lineup

    前言 这题出现在RMQRMQRMQ的WordWordWord文档中,我就直接把以前ACACAC过的程序交上去,结果WAWAWA了,然后才发现这道题还要求最小值... 链接 http://poj.org ...

  8. POJ 3264: Balanced Lineup

    2019独角兽企业重金招聘Python工程师标准>>> 题目在此 解题思路:查询区间最大值/最小值之差,最基础的线段树应用. 代码: #include <cstdio>/ ...

  9. poj Balanced Lineup RMQ

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

最新文章

  1. Mysql Cluster节点类型
  2. phpstorm version 2016.2 License Server激活
  3. C++ Primer 5th笔记(chap 14 重载运算和类型转换)标准库函数对象
  4. [05] Session概要
  5. Nature子刊:中科院动物所合作揭示灵长类血管衰老的驱动力
  6. 安卓文件操作全解:内部文件、公共文件、私有文件、app静态文件
  7. 关于协方差矩阵的理解
  8. 轻松掌柜显示不能连接到服务器,轻松掌柜推出在线进销存云端版
  9. python 分词及语义识别
  10. STM8S003F3 内部时钟初始化以及定时器做延时的使用
  11. 行人重识别论文阅读8-FastReID京东快速行人重识别
  12. Extended VINS-Mono: 大规模户外环境进行绝对和相对车辆定位的系统性方法(IROS2021)...
  13. Crazy bubbles
  14. CAD -2012软件安装的讲解
  15. 第三届艺星超级品牌日钜献·世界名曲音乐会,全网直播!
  16. 新书的各种购买方式汇总【人人都是产品经理】
  17. 润物细无声之千分之一
  18. 一篇文章解读提速、降费黑科技:PCDN定义、功能、架构、场景和优势
  19. Activiti应用
  20. curl工具使用简介

热门文章

  1. 感悟笔记(一)多思无益
  2. 遥感影像的“全色”和“多光谱”
  3. HTML+CSS实现心形效果
  4. ubuntu系统学习4——安装engin和opencv3
  5. 解决Android 6.0 Sim卡 iccid获取不完整问题
  6. 人物关系知识图谱echarts斗破苍穹
  7. 从渲染原理谈前端性能优化
  8. continue的用法
  9. 刚安装完成的Jmeter5打开之后没有工作台
  10. Bootstrap前端组件库+构建管理