POJ 3264 Balanced Lineup 线段树 第三题
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
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
报告:
题目大意: 有一排高度不一的牛(...),现在给出它们的高度,给几个区间求区间内的最高的牛和最矮的牛的“身高差”。
题解:
自己写的时候是用结构体记录各个区间内的最大值和最小值,然后返回查询的区间所求的最大值和最小值的差。样例过了,但是其他的却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 线段树 第三题的更多相关文章
- [POJ] 3264 Balanced Lineup [线段树]
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
http://poj.org/problem?id=3264 题目大意: 给定N个数,还有Q个询问,求每个询问中给定的区间[a,b]中最大值和最小值之差. 思路: 依旧是线段树水题~ #include ...
- 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 ...
- POJ - 3264 Balanced Lineup 线段树解RMQ
这个题目是一个典型的RMQ问题,给定一个整数序列,1~N,然后进行Q次询问,每次给定两个整数A,B,(1<=A<=B<=N),求给定的范围内,最大和最小值之差. 解法一:这个是最初的 ...
- 【POJ】3264 Balanced Lineup ——线段树 区间最值
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 34140 Accepted: 16044 ...
- Poj 3264 Balanced Lineup RMQ模板
题目链接: Poj 3264 Balanced Lineup 题目描述: 给出一个n个数的序列,有q个查询,每次查询区间[l, r]内的最大值与最小值的绝对值. 解题思路: 很模板的RMQ模板题,在这 ...
- POJ 3264 Balanced Lineup【线段树区间查询求最大值和最小值】
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 53703 Accepted: 25237 ...
- poj 3264:Balanced Lineup(线段树,经典题)
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 32820 Accepted: 15447 ...
随机推荐
- Python学习笔记12—类
典型的类和调用方法: #!/usr/bin/env Python # coding=utf-8 __metaclass__ = type #新式类 class Person: #创建类 def __i ...
- JavaSE复习_5 Eclipse的常见操作
△用鼠标点击生成的java源文件,按下F4可以观察类的生成的层次结构 △window-showreview:可以显示命令窗口. window-perspective-reset:可以将打乱的命令窗 ...
- 【Todo】秒杀系统材料
秒杀系统:Link <一个经验证可落地的秒杀系统实践思路> 主要依赖于Redis进行处理. http://geek.csdn.net/news/detail/59847 淘宝大秒系统设 ...
- Android设置Activity启动和退出时的动画
业务开发时遇到的一个小特技,要求实现Activity启动时自下向上弹出,退出时自上向下退出. 此处不关注启动和退出时其他Activity的动画效果,实现方法有两种: 1.代码方式,通过Activity ...
- git 命令行操作
Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目 这里说一下在命令行对git进行操作 git init [在本地初始化一个git库] //当你的git服务器里面已经有文 ...
- openfire过滤脏话插件,控制消息是否发送
参考:http://myopenfire.com/article/getarticle/9 package com.myopenfire.plugin; import java.io.File; im ...
- 如何让JS的变量名变量化
unction message() { var k=0; // var olk+k="sdasdasd"; eval("var olk"+k+"='a ...
- VIM 打造 c/c++ IDE
1. vim 的安装 $sudo apt-get install vim vim-scripts vim-doc <br> 其中vim-scripts包含了vim的一些基本插件,包括语法高 ...
- json遍历key value
http://blog.csdn.net/lanshengsheng2012/article/details/17679487 public static void main(String[] arg ...
- 队列 - 从零开始实现by C++
参考链接:数据结构探险-队列篇 数据结构太重要了,不学好是没法进行软件开发的. C++写数据结构基本套路:一个.h文件写该数据结构类的接口:一个.cpp文件写接口的具体实现:一个main.cpp用于测 ...