传送门:http://poj.org/problem?id=3264

Balanced Lineup
Time Limit: 5000MS   Memory Limit: 65536K
Total Submissions: 66241   Accepted: 30833
Case Time Limit: 2000MS

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

Source

题意概括:

给出一段长度为 N 的序列,和 Q 次查询。

每次输入区间,求解该区间 最大值 - 最小值的结果。

解题思路:

RMQ问题可以线段树维护(甚至树状数组)复杂度 预处理 O(NlongN) 单次查询 O(logN)

不过这里用的是 ST表 预处理O(NlogN) 单次查询 O(1)

ST表 本质思想是 dp,这里用两个dp 维护区间最大值和最小值。

设 起点是 i 区间长度为

区间 【i , i +(1 << j )】的最大值为 dpmax[ i, j ],最小值为 dpmin[ i, j ]

转移方程:

dpmax[ i, j ] = max( dpmax[ i ][ j-1 ], dpmax[ i + (1<<(j-1)) ][ j ] );

dpmin[ i, j ] = min( dpmin[ i ][ j-1 ], dpmin[ i + (1<<(j-1)) ][ j ] );

实质就是按照二的幂次方关系,把一个区间分成了两个区间。

AC code:

 #include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#define INF 0x3f3f3f3f
#define LL long long
using namespace std;
const int MAXN = 5e4+;
int dpmax[MAXN][];
int dpmin[MAXN][];
int num[MAXN]; void make_maxRMQ(int N, int b[])
{
for(int i = ; i < N; i++){
dpmax[i][] = b[i];
}
for(int ilen = ; (<<ilen) <= N; ilen++)
for(int i = ; i+(<<ilen)- < N; i++){
dpmax[i][ilen] = max(dpmax[i][ilen-], dpmax[i+(<<(ilen-))][ilen-]);
}
} int get_max(int ll, int rr)
{
int k = (int)(log(rr-ll+1.0)/log(2.0));
return max(dpmax[ll][k], dpmax[rr-(<<k)+][k]);
} void make_minRMQ(int N, int a[])
{
for(int i = ; i < N; i++){
dpmin[i][] = a[i];
}
for(int ilen = ; (<<ilen) <= N; ilen++)
for(int i = ; i+(<<ilen)- < N; i++){
dpmin[i][ilen] = min(dpmin[i][ilen-], dpmin[i+(<<(ilen-))][ilen-]);
}
} int get_min(int ll, int rr)
{
int k = (int)(log(rr-ll+1.0)/log(2.0));
return min(dpmin[ll][k], dpmin[rr-(<<k)+][k]);
} int main()
{
int N, Q;
int L, R;
int ans;
while(~scanf("%d%d", &N, &Q)){
for(int i = ; i < N; i++){
scanf("%d", &num[i]);
}
make_maxRMQ(N, num);
make_minRMQ(N, num); while(Q--){
scanf("%d%d", &L, &R);
L--, R--;
ans = get_max(L, R) - get_min(L, R);
printf("%d\n", ans);
}
}
return ;
}

POJ 3264 Balanced Lineup 【ST表 静态RMQ】的更多相关文章

  1. POJ 3264 Balanced Lineup | st表

    题意: 求区间max-min st表模板 #include<cstdio> #include<algorithm> #include<cstring> #inclu ...

  2. [POJ] 3264 Balanced Lineup [ST算法]

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

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

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

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

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

  5. Poj 3264 Balanced Lineup RMQ模板

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

  6. poj 3264 Balanced Lineup (RMQ)

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

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

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

  8. POJ 3264 Balanced Lineup(ST模板)

    链接:http://poj.org/problem?id=3264 题意:给n个数,求一段区间L,R的最大值 - 最小值,Q次询问 思路:ST表模板,预处理区间最值,O(1)复杂度询问 AC代码: # ...

  9. poj 3264 Balanced Lineup(RMQ裸题)

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 43168   Accepted: 20276 ...

随机推荐

  1. 获取URL中某个参数的值

    JS代码: function getQueryString(name){ var reg = new RegExp("(^|&)" + name + "=([^& ...

  2. dozer 简单用法

    maven添加必要的库: <!-- https://mvnrepository.com/artifact/net.sf.dozer/dozer --> <dependency> ...

  3. Cannot find module 'object-keys' 的解决办法

    把node_modules文件夹删除,重新cnpm install安装node_modules就好了.

  4. node.js搭建https服务器

    HTTPS简介 HTTPS:(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版. ...

  5. 前端定位Position属性四个值

    1.static(静态定位):默认值.没有定位,元素出现在正常的流中. 2.relative(相对定位):生成相对定位的元素,通过top,bottom,left,right的设置相对于其正常(原先本身 ...

  6. 详细解析 HTTP 与 HTTPS 的区别

    详细解析 HTTP 与 HTTPS 的区别 超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览 ...

  7. 配置centos7 网卡

    进入root模式,输入 cd /etc/sysconfig/network-scripts/ 按Tab键查看网卡配置文件名称,然后进入编辑: 如: cd /etc/sysconfig/network- ...

  8. html dl dt dd 标签语法与使用

    一.dl dt dd认识 html <dl> <dt> <dd>是一组合标 […]

  9. sqlite 时间函数及时间处理

    SQLite分页显示:Select * From news order by id desc Limit 10 Offset 10这篇文章是根据 SQLite 官方 WIKI 里的内容翻译,如果有什么 ...

  10. Android 最新 Support V4 包大拆分有用吗?

    Google 更新了最新的 Support Library 版本,其中最为显眼的功能莫过于 support-v4 大拆分,然后这个拆分现在看来并没有那么美好. v4 包从 2011 年开始引入,包含 ...