Balanced Lineup

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

线段树,也叫区间树(interval tree),它在各个节点保存一条线段(即子数组)。设数列A 包含
N 个元素,则线段树的根节点表示整个区间A[1;N],左孩子表示区间A[1; (1 + N)/2],右孩子表
示区间A[(1 + N)/2 + 1;N],不断递归,直到叶子节点,叶子节点只包含一个元素。
线段树有如下特征:
• 线段树是一棵完全二叉树
• 线段树的深度不超过logL, L 是区间的长度
• 线段树把一个长度为L 的区间分成不超过2 logL 条线段
线段树的基本操作有构造线段树、区间查询和区间修改。
线段树通常用于解决和区间统计有关的问题。比如某些数据可以按区间进行划分,按区间动态
进行修改,而且还需要按区间多次进行查询,那么使用线段树可以达到较快的查询速度。
用线段树解题,关键是要想清楚每个节点要存哪些信息(当然区间起点和终点,以及左右孩子
指针是必须的���,以及这些信息如何高效查询,更新。不要一更新就更新到叶子节点,那样更新操作
的效率最坏有可能O(N) 的。

用数组存储完全二叉树,可以使速度更快~

#include <iostream>
#include <vector>
#include <algorithm>
#include<map>
#include<vector>
#include<queue>
#include<string>
#include<set>
#include<cmath>
#include<cstdio>
#include<sstream>
#include<cstring>
//#pragma warning(disable:4996)
using namespace std;
#define MAXN 50001
#define INF 0x7fffffff;
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define L(a) ((a)<<1)
#define R(a) (((a)<<1)+1)
//数组存储线段树
typedef struct node_t {
int left, right;
int maxx, minx;
} node_t;
int a[MAXN];
node_t node[MAXN * 4];
int minx, maxx;
void init() {
memset(node, 0, sizeof(node));
}
//以t为根节点,为区间l,r建立线段树
void build(int t, int l, int r) {
node[t].left = l, node[t].right = r;
if (l == r) {
node[t].maxx = node[t].minx = a[l];
return;
}
const int mid = (l + r) / 2;
build(L(t), l, mid);
build(R(t), mid + 1, r);
node[t].maxx = max(node[L(t)].maxx, node[R(t)].maxx);
node[t].minx = min(node[L(t)].minx, node[R(t)].minx);
}
void query(int t, int l, int r) {
if (t > 200000) {
minx = maxx = 0;
return;
}
if (node[t].left == l&&node[t].right == r) {
if (maxx < node[t].maxx)
maxx = node[t].maxx;
if (minx > node[t].minx)
minx = node[t].minx;
return;
}
const int mid = (node[t].left + node[t].right) / 2;
if (l > mid) {
query(R(t), l, r);
}
else if (r <= mid) {
query(L(t), l, r);
}
else {
query(L(t), l, mid);
query(R(t), mid + 1, r);
}
}
int main()
{
//freopen("s.txt", "r", stdin);
int n, q, i;
scanf("%d%d", &n, &q);
for (i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
}
init();
build(1, 1, n);
while (q--) {
int a, b;
scanf("%d%d", &a, &b);
maxx = 0;
minx = INF;
query(1, a, b);
printf("%d\n", maxx - minx);
}
return 0;
}

初级线段树 POJ3264的更多相关文章

  1. poj3264(简单线段树)

    题目链接:https://vjudge.net/problem/POJ-3264 题意:线段树简单应用题,区间查询最大值和最小值的差. 思路:用线段树维护区间的最大值和最小值即可. AC代码: #in ...

  2. Balanced Lineup poj3264 线段树

    Balanced Lineup poj3264 线段树 题意 一串数,求出某个区间的最大值和最小值之间的差 解题思路 使用线段树,来维护最大值和最小值,使用两个查询函数,一个查区间最大值,一个查区间最 ...

  3. 几道简单的线段树入门题 POJ3264&&POJ3468&&POJ2777

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 40687   Accepted: 19137 ...

  4. [POJ3264]Balanced Lineup(线段树,区间最值差)

    题目链接:http://poj.org/problem?id=3264 一排牛按1~n标号记录重量,问每个区间最重的和最轻的差值. 线段树维护当前节点下属叶节点的两个最值,查询后作差即可. #incl ...

  5. POJ3264——Balanced Lineup(线段树)

    本文出自:http://blog.csdn.net/svitter 题意:在1~200,000个数中.取一段区间.然后在区间中找出最大的数和最小的数字.求这两个数字的差. 分析:按区间取值,非常明显使 ...

  6. poj3264(线段树区间求最值)

    题目连接:http://poj.org/problem?id=3264 题意:给定Q(1<=Q<=200000)个数A1,A2,```,AQ,多次求任一区间Ai-Aj中最大数和最小数的差. ...

  7. POJ3264(线段树求区间最大最小值)

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 41162   Accepted: 19327 ...

  8. kuangbin专题七 POJ3264 Balanced Lineup (线段树最大最小)

    For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same order. One d ...

  9. POJ-3264 Balanced Lineup(区间最值,线段树,RMQ)

    http://poj.org/problem?id=3264 Time Limit: 5000MS     Memory Limit: 65536K Description For the daily ...

  10. 【ACM/ICPC2013】线段树题目集合(一)

    前言:前一段时间在网上找了一个线段树题目列表,我顺着做了一些,今天我把做过的整理一下.感觉自己对线段树了解的还不是很深,自己的算法能力还要加强.光练代码能力还是不够的,要多思考.向队友学习,向大牛学习 ...

随机推荐

  1. WPF入门教程系列二十四——DataGrid使用示例(2)

    WPF入门教程系列目录 WPF入门教程系列二--Application介绍 WPF入门教程系列三--Application介绍(续) WPF入门教程系列四--Dispatcher介绍 WPF入门教程系 ...

  2. shell工具和脚本

    Shell脚本 shell 脚本是一种更加复杂度的工具. 大多数shell都有自己的一套脚本语言,包括变量.控制流和自己的语法.shell脚本 与其他脚本语言不同之处在于,shell 脚本针对 she ...

  3. 记录部署Datax、Datax-web 过程碰到的问题

    我的第一篇博客 datax在网络上部署的文档有很多,这里不重复阐述,只描述过程中碰到的些许问题,记录下来. 1. 1 ERROR RetryUtil - Exception when calling ...

  4. 使用Flask和Django构建Web应用程序:现代Web应用程序框架

    目录 1. 引言 2. 技术原理及概念 2.1 基本概念解释 2.2 技术原理介绍 2.3 相关技术比较 3. 实现步骤与流程 3.1 准备工作:环境配置与依赖安装 3.2 核心模块实现 3.3 集成 ...

  5. 区块链应用:椭圆曲线数字签名算法ECDSA

    1 椭圆曲线密码学 椭圆曲线密码学(Elliptic Curve Cryptography,缩写ECC),是基于椭圆曲线数学理论实现的一种非对称加密算法.椭圆曲线在密码学中的使用是在1985年有Nea ...

  6. PHP curl提交参数到某个网址,然后获取数据

    <?php $data = '你的每个参数'; $url = 'https://www.bz80.vip/'; //举例 $html = post_data($url,$data); echo ...

  7. Windows/DOS与Unix文件格式之间的相互转换(/r/n问题)

    PS:今天遇到一个文件转换问题,现在将网上搜索到资料贴出来.. 第一个资料 Windows/DOS与Unix文件格式是不同的,问题一般就是出在/r/n问题上. 回车(CR)和换行(LF)符都是用来表示 ...

  8. Pb从入坑到放弃(三)数据窗口

    写在前面 数据窗口是Pb的一个特色控件,有了数据窗口对于pb来说可谓如虎添翼. 对数据库中的数据操作,几乎都可以在数据窗口中完成. 使用数据窗口可以简单检索数据.以图形化的方式显示数据.绘制功能强大的 ...

  9. AI技术在软件测试中的应用和实践

    随着人工智能(AI)技术的快速发展,它在各个领域都展现出了巨大的潜力和影响力.在软件测试领域,AI技术也越来越得到重视和应用.本文将探讨AI技术在软件测试中的应用和实践,重点关注chatGPT如何根据 ...

  10. 前端关于table的设置

    表格超长度后加... table{ table-layout:fixed; } td{ overflow:hidden; text-overflow:ellipsis; white-space:now ...