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

报告:

题目大意: 有一排高度不一的牛(...),现在给出它们的高度,给几个区间求区间内的最高的牛和最矮的牛的“身高差”。

题解:

  自己写的时候是用结构体记录各个区间内的最大值和最小值,然后返回查询的区间所求的最大值和最小值的差。样例过了,但是其他的却WA了。。表示很奇怪,现在写博客才想起来我这一点还没想明白,就直接去看题解了........那先把这个只过得了样例的程序传了吧。

  .......

结果去调试发现连样例都没有过,于是分析了一下,这样写的话,如果查询区间在以分的区间两端,就只会直接返回一段的差值了。代码如下: 

 1 #include<iostream>
#include<cstdio>
#define l(u) (u<<1)
#define r(u) (u<<1|1)
using namespace std;
int n,q,highest,lowest;
int cow[];
struct pp{
int l,r,mins,maxs;
};
pp node[];
int min(int a,int b)
{
return a<b?a:b;
}
int max(int a,int b)
{
return a>b?a:b;
}
void build(int u,int left,int right)
{
node[u].l=left;node[u].r=right;
if (node[u].l==node[u].r)
{
node[u].mins=cow[left];
node[u].maxs=cow[left];
return ;
}
int mid=(left+right)>>;
build(l(u),left,mid);
build(r(u),mid+,right);
node[u].mins=min(node[l(u)].mins,node[r(u)].mins);
node[u].maxs=max(node[l(u)].maxs,node[r(u)].maxs);
}
int query(int u,int left,int right)
{
if (node[u].l==left&&node[u].r==right)
{
return node[u].maxs-node[u].mins;
}
int mid=(node[u].l+node[u].r)>>;
if (right<=mid) query(l(u),left,right);
else if (left>mid) query(r(u),left,right);
else
{
query(l(u),left,mid);
query(r(u),mid+,right);
}
}
int main()
{
freopen("balance.in","r",stdin);
cin>>n>>q;
for(int i=;i<=n;i++)
scanf("%d",&cow[i]);
build(,,n);
for(int i=;i<=q;i++)
{
int a,b;
//highest=0;//***
//lowest=1234567;//***
scanf("%d%d",&a,&b);
printf("%d\n",query(,a,b));
}
return ;
}

正确的代码中是用 high 和low 来记录比较最大值和最小值并且只是 void 并不 返回值,这样一来就可以得到正确的答案了。

代码如下:

 #include<iostream>
#include<cstdio>
#define l(u) (u<<1)
#define r(u) (u<<1|1)
using namespace std;
int n,q,highest,lowest;
int cow[];
struct pp{
int l,r,mins,maxs;
};
pp node[];
int min(int a,int b)
{
return a<b?a:b;
}
int max(int a,int b)
{
return a>b?a:b;
}
void build(int u,int left,int right)
{
node[u].l=left;node[u].r=right;
if (node[u].l==node[u].r)
{
node[u].mins=cow[left];
node[u].maxs=cow[left];
return ;
}
int mid=(left+right)>>;
build(l(u),left,mid);
build(r(u),mid+,right);
node[u].mins=min(node[l(u)].mins,node[r(u)].mins);
node[u].maxs=max(node[l(u)].maxs,node[r(u)].maxs);
}
void query(int u,int left,int right)
{
if (node[u].l==left&&node[u].r==right)
{
lowest=min(lowest,node[u].mins);//***
highest=max(highest,node[u].maxs);///***
return ;
}
int mid=(node[u].l+node[u].r)>>;
if (right<=mid) query(l(u),left,right);
else if (left>mid) query(r(u),left,right);
else
{
query(l(u),left,mid);
query(r(u),mid+,right);
}
}
int main()
{
//freopen("balance.in","r",stdin);
cin>>n>>q;
for(int i=;i<=n;i++)
scanf("%d",&cow[i]);
build(,,n);
for(int i=;i<=q;i++)
{
int a,b;
highest=;//***
lowest=;//***
scanf("%d%d",&a,&b);
query(,a,b);
printf("%d\n",highest-lowest);
}
return ;
}

注意事项:

1、定初值。

POJ 3264 Balanced Lineup 线段树 第三题的更多相关文章

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

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

  2. poj 3264 Balanced Lineup(线段树、RMQ)

    题目链接: http://poj.org/problem?id=3264 思路分析: 典型的区间统计问题,要求求出某段区间中的极值,可以使用线段树求解. 在线段树结点中存储区间中的最小值与最大值:查询 ...

  3. POJ 3264 Balanced Lineup 线段树RMQ

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

  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模板

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

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

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

  9. poj 3264:Balanced Lineup(线段树,经典题)

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 32820   Accepted: 15447 ...

随机推荐

  1. 4 BOM编程

    4 BOM编程 编程基础 全称 Browser Object Model,浏览器对象模型. JavaScript是由浏览器中内置的javascript脚本解释器程序来执行javascript脚本语言的 ...

  2. Ubuntu 查看文件以及磁盘空间大小管理

    (1)查看文件大小  查看当前文件夹下所有文件大小(包括子文件夹)    du -sh   # du -h15M     ./package16K     ./.fontconfig4.0K    . ...

  3. Spring MVC 之拦截器(八)

     在springMVC中实现拦截器有两种方式 1.实现HandlerInterceptor接口 2.继承HandlerInterceptorAdaptor类 编写拦截器: package com.cy ...

  4. JSON和php里的数据序列化

    JSON就是一种数据结构,独立于语言 {"1":"one","2":"two","3":" ...

  5. OneProxy使用手册--致力于打造透明的数据层

    介绍      平民软件官网上线(http://www.onexsoft.com) OneProxy是由原支付宝首席架构师楼方鑫开发,目前由楼方鑫创立的杭州平民软件公司(@平民架构)提供技术支持.目前 ...

  6. 【EasyX】RGB to Gray

    code: #include <graphics.h> #include <conio.h> void main() { initgraph(, ); // 读取图片 load ...

  7. 30-Razor语法基础

    以往开发ASP.NET Web Form时,在ASPX页面上都会出现许多夹杂C#/VB.NET与HTML的情况,而先前使用<%...%>这种传统圆角括号的表示法会让HTML标签与ASP.N ...

  8. python3.x随手笔记1

    语法分析 Python程序读取的 解析器 . 解析器的输入流 令牌 ,生成的 词法分析程序 . 这一章描述了如何 词法分析程序把一个文件分解成令牌. Python读取程序文本作为Unicode代码点; ...

  9. XPath的语法

    XPath 是XML的查询语言,和SQL的角色很类似.以下面XML为例,介绍XPath 的语法. <?xml version="1.0" encoding="ISO ...

  10. CSDN中的Bug

    简述 在用CSDN的过程中,发现了许许多多的Bug.之前没有做记录,直接反馈给客服了,有时没图说得不太清楚,现在不都追求有图有真相么O(∩_∩)O~,所以在此记录一下. 作为程序员的一份子,Bug对我 ...