POJ 3264 Balanced Lineup 【ST表 静态RMQ】
传送门:http://poj.org/problem?id=3264
| 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
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
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 区间长度为 2 j
区间 【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】的更多相关文章
- POJ 3264 Balanced Lineup | st表
题意: 求区间max-min st表模板 #include<cstdio> #include<algorithm> #include<cstring> #inclu ...
- [POJ] 3264 Balanced Lineup [ST算法]
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 34306 Accepted: 16137 ...
- poj 3264 Balanced Lineup(线段树、RMQ)
题目链接: http://poj.org/problem?id=3264 思路分析: 典型的区间统计问题,要求求出某段区间中的极值,可以使用线段树求解. 在线段树结点中存储区间中的最小值与最大值:查询 ...
- POJ - 3264 Balanced Lineup 线段树解RMQ
这个题目是一个典型的RMQ问题,给定一个整数序列,1~N,然后进行Q次询问,每次给定两个整数A,B,(1<=A<=B<=N),求给定的范围内,最大和最小值之差. 解法一:这个是最初的 ...
- Poj 3264 Balanced Lineup RMQ模板
题目链接: Poj 3264 Balanced Lineup 题目描述: 给出一个n个数的序列,有q个查询,每次查询区间[l, r]内的最大值与最小值的绝对值. 解题思路: 很模板的RMQ模板题,在这 ...
- poj 3264 Balanced Lineup (RMQ)
/******************************************************* 题目: Balanced Lineup(poj 3264) 链接: http://po ...
- POJ - 3264 Balanced Lineup (RMQ问题求区间最值)
RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,也就 ...
- POJ 3264 Balanced Lineup(ST模板)
链接:http://poj.org/problem?id=3264 题意:给n个数,求一段区间L,R的最大值 - 最小值,Q次询问 思路:ST表模板,预处理区间最值,O(1)复杂度询问 AC代码: # ...
- poj 3264 Balanced Lineup(RMQ裸题)
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 43168 Accepted: 20276 ...
随机推荐
- [转]oracle update set select from 关联更新
本文转自:http://blog.csdn.net/disiwei1012/article/details/52589181 http://www.blogjava.net/Jhonney/archi ...
- MVC中FileResult 返回类型返回Excel
公司中以前写的导出有问题.原来使用的XML格式字符串拼接然后转化成流输出 action public FileResult ExportJobFair() { try { string name = ...
- 流畅的python和cookbook学习笔记(六)
1.同时迭代多个序列(zip(函数)) 使用zip()函数可以同时迭代多个序列. >>> X = [1, 2, 3, 4, 5, 6] >>> Y = [121, ...
- Java线程入门第三篇
Java内存模型(jmm) Why:保证多线程正确协同工作 看图说明: 文字解释:线程a和线程b通信过程,首先线程a把本地内存的共享变量更新到主内存中,然后线程b去读取主内存的共享变量,最后更新到自己 ...
- 前端(五):JavaScript面向对象之内建对象
一.数据类型 js中数据类型分为两种,原始数据累次能够和引用数据类型. 1.原始数据类型 Undefined.Null.Boolean.Number.String是js中五种原始数据类型(primit ...
- POJ 2923(状态集合背包)
http://www.cnblogs.com/kuangbin/archive/2012/09/14/2685430.html #include <iostream> #include & ...
- docker 镜像构建上下文理解
原文 写得贼好,特别鸣谢,哈哈 如果注意,会看到 docker build 命令最后有一个 . . . 表示当前目录,而 Dockerfile就在当前目录,因此不少初学者以为这个路径是在指定 Dock ...
- centos自带python2.6无法使用pip命令
1.首先检查linux有没有安装python-pip包,直接执行 yum install python-pip,或者 which pip 我的已经安装了 2.没有可用软件包 python-pip.就执 ...
- 原生js、jQuery实现选项卡功能
在大家在网上平常浏览网页的时候,想必各位都会看到选项卡功能,在这里给大家详解一下用原生js.jQuery如何来写一些基本的选项卡 话不多说,先给各位看一下功能图: 好了,下边 ...
- gulpfile配置
/** * 只包含合并压缩混淆,监听服务 */// 引入gulp模块var gulp = require('gulp'); // 引入其他模块var less = require('gulp-less ...