Balanced Lineup -POJ3264
2024-09-05 21:22:58
题意:
告诉你n头奶牛的高度,然后给你一个区间,你需要求出这个区间最高的奶牛与最矮的奶牛之间相差多少
链接:http://poj.org/problem?id=3264
思路:
线段树区间查询,用两个查询函数,一个查最大值,另一个查最小值,将他们相减即可。
代码:
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int MAXN=1e5+;
const int INF=0x7fffffff;
typedef long long ll;
int lazy[MAXN<<],max_[MAXN<<],min_[MAXN<<];
//这里在push_up的时候我们将区间最大值和区间最小值都更新一下
void push_up(int node)
{
max_[node]=max(max_[node<<],max_[node<<|]);
min_[node]=min(min_[node<<],min_[node<<|]);
}
void build(int node,int l,int r)
{
if(l==r)
{
scanf("%d",&max_[node]);
min_[node]=max_[node];
return ;
}
int mid=(l+r)>>;
build(node<<,l,mid);
build(node<<|,mid+,r);
push_up(node);
}
int query1(int node,int l,int r,int x,int y)
{
if(x<=l&&y>=r)
{
return max_[node];
}
int max1=,min1=INF;
int mid=(l+r)>>;
if(x<=mid)max1=max(max1,query1(node<<,l,mid,x,y));
if(y>mid)max1=max(query1(node<<|,mid+,r,x,y),max1);
return max1;
}
int query2(int node,int l,int r,int x,int y)
{
if(x<=l&&y>=r)
{
return min_[node];
}
int min1=INF;
int mid=(l+r)>>;
if(x<=mid)min1=min(min1,query2(node<<,l,mid,x,y));
if(y>mid)min1=min(query2(node<<|,mid+,r,x,y),min1);
return min1;
}
int main()
{
int n,k;
scanf("%d%d",&n,&k);
build(,,n);
for(int i=;i<=k;i++)
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",query1(,,n,a,b)-query2(,,n,a,b));
}
return ;
}
最新文章
- HDU 4857 逃生 (优先队列+反向拓扑)
- 初识lua
- Java日期时间处理常用方法
- smarty模板的基础搭建
- 【Maven实战】archetype的使用和eclipse的配置
- 全局获取Context的技巧
- java 读写excle
- python基础之元组,集合
- 基于SDRAM的视频图像采集系统
- Photos_2017 China MVP Community Connection
- Spring入门详细教程(三)
- Android开发学习笔记(二)——编译和运行原理(1)
- 解决Could not open Hibernate Session for transaction; nested exception is java.lang.NoClassDefFoundError: org/hibernate/engine/transaction/spi/TransactionContext
- C#实现根据日期计算星期
- Mycat 水平拆分
- tomcat 下配置 可 调试
- 关于.net core程序的部署
- 安装kafka集群
- 高性能.NET MVC之QMVC!
- [POI2017]Sabotaż