http://poj.org/problem?id=3264

Time Limit: 5000MS     Memory Limit: 65536K

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


Sample Output


Source

 
 
题意:
一个农夫有N头牛,每头牛的高度不同,我们需要找出区间[a,b]中最高的牛和最低的牛的高度差。
 
题解:
明显是区间最值问题,线段树和RMQ
 
线段树做法(耗时2.2s):
 #include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
#include <math.h>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <math.h>
const int INF=0x3f3f3f3f;
typedef long long LL;
const int mod=1e9+;
//const double PI=acos(-1);
const int maxn=1e5+;
using namespace std;
//ios::sync_with_stdio(false);
// cin.tie(NULL); int n,q;
struct node
{
int l;
int r;
int MAX;
int MIN;
}SegTree[<<]; void PushUp(int rt)
{
SegTree[rt].MAX=max(SegTree[rt<<].MAX,SegTree[rt<<|].MAX);
SegTree[rt].MIN=min(SegTree[rt<<].MIN,SegTree[rt<<|].MIN);
} void Build(int l,int r,int rt)
{
SegTree[rt].l=l;
SegTree[rt].r=r;
if(l==r)
{
scanf("%d",&SegTree[rt].MAX);
SegTree[rt].MIN=SegTree[rt].MAX;
return;
}
int mid=(l+r)>>;
Build(l,mid,rt<<);
Build(mid+,r,rt<<|);
PushUp(rt);
} int Query_MAX(int L,int R,int rt)
{
int l=SegTree[rt].l;
int r=SegTree[rt].r;
if(L<=l&&R>=r)//一次也没有被涂过
{
return SegTree[rt].MAX;
}
int MAX=;
int mid=(l+r)>>;
if(L<=mid)
MAX=max(MAX,Query_MAX(L,R,rt<<));
if(R>mid)
MAX=max(MAX,Query_MAX(L,R,rt<<|));
return MAX;
} int Query_MIN(int L,int R,int rt)
{
int l=SegTree[rt].l;
int r=SegTree[rt].r;
if(L<=l&&R>=r)//一次也没有被涂过
{
return SegTree[rt].MIN;
}
int MIN=INF;
int mid=(l+r)>>;
if(L<=mid)
MIN=min(MIN,Query_MIN(L,R,rt<<));
if(R>mid)
MIN=min(MIN,Query_MIN(L,R,rt<<|));
return MIN;
} int main()
{
scanf("%d %d",&n,&q);
Build(,n,);
for(int i=;i<=q;i++)
{
int a,b;
scanf("%d %d",&a,&b);
printf("%d\n",Query_MAX(a,b,)-Query_MIN(a,b,));
}
return ;
}
RMQ做法:
 #include<iostream>
#include<cstring>
#include<cstdio>
#include<climits>
#include<cmath>
#include<algorithm>
using namespace std; const int N = ;
int FMAX[N][], FMIN[N][]; void RMQ(int n)
{
for(int j = ; j != ; ++j)
{
for(int i = ; i <= n; ++i)
{
if(i + ( << j) - <= n)
{
FMAX[i][j] = max(FMAX[i][j - ], FMAX[i + ( << (j - ))][j - ]);
FMIN[i][j] = min(FMIN[i][j - ], FMIN[i + ( << (j - ))][j - ]);
}
}
}
} int main()
{
int num, query;
int a, b;
while(scanf("%d %d", &num, &query) != EOF)
{
for(int i = ; i <= num; ++i)
{
scanf("%d", &FMAX[i][]);
FMIN[i][] = FMAX[i][];
}
RMQ(num);
while(query--)
{
scanf("%d%d", &a, &b);
int k = (int)(log(b - a + 1.0) / log(2.0));
int maxsum = max(FMAX[a][k], FMAX[b - ( << k) + ][k]);
int minsum = min(FMIN[a][k], FMIN[b - ( << k) + ][k]);
printf("%d\n", maxsum - minsum);
}
}
return ;
}
 
最后推荐一篇写的挺好的一篇博客:https://blog.csdn.net/weixin_43272781/article/details/83443310
 
 
 
 

POJ-3264 Balanced Lineup(区间最值,线段树,RMQ)的更多相关文章

  1. POJ 3264 Balanced Lineup 区间最值

    POJ3264 比较裸的区间最值问题.用线段树或者ST表都可以.此处我们用ST表解决. ST表建表方法采用动态规划的方法, ST[I][J]表示数组从第I位到第 I+2^J-1 位的最值,用二分的思想 ...

  2. poj 3264 Balanced Lineup 区间极值RMQ

    题目链接:http://poj.org/problem?id=3264 For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) alw ...

  3. POJ 3264.Balanced Lineup-结构体版线段树(区间查询最值)

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 53721   Accepted: 25244 ...

  4. POJ 3264 Balanced Lineup(模板题)【RMQ】

    <题目链接> 题目大意: 给定一段序列,进行q次询问,输出每次询问区间的最大值与最小值之差. 解题分析: RMQ模板题,用ST表求解,ST表用了倍增的原理. #include <cs ...

  5. Poj 3264 Balanced Lineup RMQ模板

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

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

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

  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 【线段树/区间最值差】

    Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 62103 Accepted: 29005 Cas ...

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

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

  10. POJ - 3264——Balanced Lineup(入门线段树)

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 68466   Accepted: 31752 ...

随机推荐

  1. 快速幂(51Nod1046 A^B Mod C)

    快速幂也是比较常用的,原理在下面用代码解释,我们先看题. 51Nod1046 A^B Mod C 给出3个正整数A B C,求A^B Mod C. 例如,3 5 8,3^5 Mod 8 = 3. In ...

  2. 字符串专题之KMP算法

    写点自己对KMP的理解,我们有两个字符串A和B,求A中B出现了多少次. 这种问题就可以用KMP来求解. 朴素的匹配最坏情况是O(n^2)的.KMP是个高效的算法,效率是O(n)的. KMP算法的思想是 ...

  3. 用ps画一个Gif的小房子(1)

    效果如图: 制作方法: 1.新建200*200的画布:复制一块小房子图片 2.点击窗口-时间轴-勾选帧动画 3.如图所示(我这边是一帧对应一个图层) 4.新建图层-这边要新建24个图层,每个图层对应不 ...

  4. ..\OBJ\CAN.axf: Error: L6411E: No compatible library exists with a definition of startup symbol __main.

    ..\OBJ\CAN.axf: Error: L6411E: No compatible library exists with a definition of startup symbol __ma ...

  5. 存储基本概念(lun,volume,HBA,DAS,NAS,SAN,iSCSI,IPSAN)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/liukuan73/article/det ...

  6. c++ 获取GMT 时间和字符串

    需要跨平台,所以可选的只有std 和 boost: boost 比较复杂了 #include <boost/date_time/local_time/local_time.hpp> std ...

  7. Java简单调用Lua

    package lua; import org.keplerproject.luajava.LuaState; import org.keplerproject.luajava.LuaStateFac ...

  8. Ribbon使用及其客户端负载均衡实现原理分析

    1.ribbon负载均衡测试 (1)consumer工程添加依赖 <dependency> <groupId>org.springframework.cloud</gro ...

  9. python3 str.encode bytes.decode

    str.encode 把字符串编码成字节序列 bytes.decode 把字节序列解码成字符串 https://docs.python.org/3.5/library/stdtypes.html st ...

  10. EL表达式和JSTL(一)

    一. 初始JavaBean 在软件开发时,有些数据时经常要用到的,为了方便进行移植,Sun公司提出了一种JavaBean技术,使用JavaBean对这些数据进行封装,做到一次编写,到处开发. Java ...