传送门: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. Shiro - 自定义filterChainDefinitions和Realm

    在Spring Context中定义shiroFilter(org.apache.shiro.spring.web.ShiroFilterFactoryBean)时需要为其filterChainDef ...

  2. redis(6)lua脚本

    一.lua脚本 lua是一种轻量小巧的脚本语言,用标准的C语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能. lua的详细内容你可以参考lua官方网站 ...

  3. Be opinionated out of the box but get out of the way quickly as requirements start to diverge from

    Be opinionated out of the box but get out of the way quickly as requirements start to diverge from t ...

  4. Gradle sync failed: Cannot set the value of read-only property 'outputFile'

    错误 Gradle sync failed: Cannot set the value of read-only property 'outputFile' 原因 gradle打包,自定义apk名称代 ...

  5. Mybatis插入、查询自定义的数据类型的方式

    1.首先创建JavaBean对象 package com.zuo.Mybatis.bean; public class PhoneNumber { private String countryCode ...

  6. Oracle自定义函数&加密

    在sql中频繁使用的功能(逻辑.加密等)可以写成自定义函数进行封装,之后再调用即可. CREATE OR REPLACE FUNCTION "函数名" (参数名 参数类型 参数数据 ...

  7. CakePHP redirect函数

    public function getContract($value=''){ App::uses ( 'UserContractController', 'Controller' ); $Contr ...

  8. javascript获取元素样式值

    使用css控制页面有4种方式,分别为行内样式(内联样式).内嵌式.链接式.导入式. 行内样式(内联样式)即写在html标签中的style属性中,如<div style="width:1 ...

  9. easyui numberbox 输入框禁止输入

    { field: 'Amount', title: '金额', width: 80, editor: { type: 'numberbox', options: { disabled: true, p ...

  10. easyui扩展行默认展开 以及 去除滚动条

     问题背景: 在做打印页面的时候,要求有详细的默认展开显示.    遇到的问题: 1)在用扩展行的时候,grid的所有行都添加了展开收起的图标,(第二行没有明细)如下  2)默认展示有详细行的时候,内 ...