题目链接: http://poj.org/problem?id=3264

思路分析:

典型的区间统计问题,要求求出某段区间中的极值,可以使用线段树求解。

在线段树结点中存储区间中的最小值与最大值;查询时使用线段树的查询

方法并稍加修改即可进行查询区间中最大与最小值的功能。

代码(线段树解法):

#include <limits>
#include <cstdio>
#include <iostream>
using namespace std; const int MAX_N = ;
const int N_VAL = + ;
struct SegTreeNode
{
int valMin, valMax;
}; SegTreeNode segTree[MAX_N];
int val[N_VAL];
int valMax, valMin; int Max(int a, int b) { return a > b ? a : b; }
int Min(int a, int b) { return a > b ? b : a; }
void Build(int root, int nbegin, int nend, int arr[])
{
if (nbegin == nend)
{
segTree[root].valMax = arr[nbegin];
segTree[root].valMin = arr[nbegin];
}
else
{
int mid = (nbegin + nend) / ; Build( * root, nbegin, mid, arr);
Build( * root + , mid + , nend, arr);
segTree[root].valMax = Max(segTree[ * root].valMax, segTree[ * root + ].valMax);
segTree[root].valMin = Min(segTree[ * root].valMin, segTree[ * root + ].valMin);
}
} void Query(int root, int nbegin, int nend, int qbegin, int qend)
{
if (nbegin > qend || nend < qbegin)
return;
if (qbegin <= nbegin && qend >= nend)
{
if (valMax < segTree[root].valMax)
valMax = segTree[root].valMax;
if (valMin > segTree[root].valMin)
valMin = segTree[root].valMin;
return;
} int mid = (nbegin + nend) / ; Query( * root, nbegin, mid, qbegin, qend);
Query( * root + , mid + , nend, qbegin, qend);
} int main()
{
int qbegin, qend;
int count = , N, Q; scanf("%d%d", &N, &Q);
while (count++ < N)
scanf("%d", &val[count]); Build(, , N, val);
while (Q--)
{
valMax = INT_MIN, valMin = INT_MAX;
scanf("%d%d", &qbegin, &qend);
Query(, , N, qbegin, qend);
printf("%d\n", valMax - valMin);
} return ;
}

代码(RMQ解法):

#include <cstdio>
#include <cmath>
#include <iostream>
using namespace std; const int MAX_L = ;
const int MAX_N = + ;
int height[MAX_N];
int max_h[MAX_N][MAX_L], min_h[MAX_N][MAX_L]; void RmqMaxInit(int n)
{
for (int j = ; j < MAX_L; ++j)
{
for (int i = ; i < n; ++i)
{
if (j == )
max_h[i][j] = height[i];
else
{
max_h[i][j] = max_h[i][j - ];
int p = i + ( << (j - ));
if (p < n)
{
if (max_h[p][j - ] > max_h[i][j])
max_h[i][j] = max_h[p][j - ];
}
}
}
}
} int RmqMaxQuery(int l, int r)
{
if (l > r)
{
int temp = l;
l = r;
r = temp;
}
int k = log(r - l + ) / log();
return max_h[l][k] > max_h[r - ( << k) + ][k] ?
max_h[l][k] : max_h[r - ( << k) + ][k];
} void RmqMinInit(int n)
{
for (int j = ; j < MAX_L; ++j)
{
for (int i = ; i < n; ++i)
{
if (j == )
min_h[i][j] = height[i];
else
{
min_h[i][j] = min_h[i][j - ];
int p = i + ( << (j - ));
if (p < n)
{
if (min_h[p][j - ] < min_h[i][j])
min_h[i][j] = min_h[p][j - ];
}
}
}
}
} int RmqMinQuery(int l, int r)
{
if (l > r)
{
int temp = l;
l = r;
r = temp;
} int k = log(r - l + ) / log();
return min_h[l][k] < min_h[r - ( << k) + ][k] ?
min_h[l][k] : min_h[r - ( << k) + ][k];
} int main()
{
int num_len, query_num; scanf("%d %d", &num_len, &query_num);
for (int i = ; i < num_len; ++i)
scanf("%d", &height[i]);
RmqMaxInit(num_len);
RmqMinInit(num_len); for (int i = ; i < query_num; ++i)
{
int l = , r = ;
int min_height = , max_height = ; scanf("%d %d", &l, &r);
max_height = RmqMaxQuery(l - , r - );
min_height = RmqMinQuery(l - , r - );
printf("%d\n", max_height - min_height);
} return ;
}

poj 3264 Balanced Lineup(线段树、RMQ)的更多相关文章

  1. POJ 3264 Balanced Lineup 线段树RMQ

    http://poj.org/problem?id=3264 题目大意: 给定N个数,还有Q个询问,求每个询问中给定的区间[a,b]中最大值和最小值之差. 思路: 依旧是线段树水题~ #include ...

  2. [POJ] 3264 Balanced Lineup [线段树]

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

  3. POJ 3264 Balanced Lineup 线段树 第三题

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

  4. POJ 3264 Balanced Lineup (线段树)

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

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

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

  6. 【POJ】3264 Balanced Lineup ——线段树 区间最值

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 34140   Accepted: 16044 ...

  7. 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 ...

  8. Poj 3264 Balanced Lineup RMQ模板

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

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

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

随机推荐

  1. java 笔试

    单例设计模式: public class Singliton { //no new private Singliton (){ } static Singliton ins = null; publi ...

  2. JavaSE复习日记 : 递归函数

    /* * 递归函数 * 什么是递归? * 在一个方法的内部,对自身进行调用,又叫做递归调用 * * 递归和循环的编写都包括三部分: * 1. 初始值; * 2. 终止条件; * 3. 前进步长; * ...

  3. 理解ROS的节点(NODE)

    经过前面的学习,我们已经知道了如何构建一个ROS的包,这篇博客将介绍ROS中的节点的概念. 在继续之前,请按ctrl+alt+t打开一个终端,在里面输入: sudo apt-get install r ...

  4. 常用Android快速开发框架

    在做项目的过程中遇到了很多困难,于是收集了一些快速开发的框架,使用后大大提高了项目开发速度,无论什么项目都可以使用的到,在此分享给大家,希望能对大家有帮助!(个人建议:有时间的同学可以看一下这些优秀框 ...

  5. 四轴飞行器1.5 各种PID对比分析及选择

    原创文章,欢迎转载,转载请注明出处 这篇文章主要介绍我对PID的理解,以及选择PID算法的过程. 一 PID的理解和学习过程 二 飞控的PID效果 先上个飞控PID的响应的视频:介绍在后面 地址:ht ...

  6. 4_Is Prime

    4 // // ViewController.swift // Is Prime // // Created by ZC on 16/1/9. // Copyright © 2016年 ZC. All ...

  7. Azure 网站上的 Java

     编辑人员注释:本文章由Windows Azure 网站团队的项目经理Chris Compy 撰写. Microsoft 已推出针对 Azure 网站上基于 Java 的网站的支持.此功能旨在通过 ...

  8. 蓝桥杯之FBI树问题

    问题描述 我们可以把由"0"和"1"组成的字符串分为三类:全"0"串称为B串,全"1"串称为I串,既含"0&q ...

  9. Git安装及基本使用

    准备: Git软件,github账号. Git安装: 直接百度搜git下载,windows和mac不同平台的.官网上的下载地址很慢或者根本下不了. 默认配置安装. github: 网址:https:/ ...

  10. Java程序栈信息文件中的秘密(五)

    最近发现在使用jstack工具在导出Java应用的线程栈时有一个小小的窍门,比如Linux环境上有一个用户为appuser,假如以这个用户启动了一个Java进程B,如果想要导出进程B的线程栈,则必须切 ...