POJ 3264 Balanced Lineup【线段树】
2024-08-31 10:32:57
题意:给出n个数,a1,a2,a3,---,an,再给出q次询问区间al到ar之间的最大值和最小值的差
学习线段树的第一道题目 学习的这一篇
http://www.cnblogs.com/kuangbin/archive/2011/08/14/2137862.html
#include<iostream>
#include<cstdio>
#include<cstring>
#include <cmath>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<algorithm>
using namespace std; typedef long long LL;
const int INF = (<<)-;
const int mod=;
const int maxn=; int a[maxn];
int nmax,nmin; struct node{
int l,r;//记录区间的左右端点
int nmax,nmin;//记录区间的最大值,最小值
}; node tree[*maxn]; void build_tree(int i,int l,int r){//建树
tree[i].l=l;
tree[i].r=r;
if(l==r){
tree[i].nmin=tree[i].nmax=a[l];
return;
}
int mid=(l+r)/;
build_tree(*i,l,mid);
build_tree(*i+,mid+,r);
tree[i].nmin=min(tree[*i].nmin,tree[*i+].nmin);
tree[i].nmax=max(tree[*i].nmax,tree[*i+].nmax);
} void query(int i,int l,int r){//查询
if(tree[i].nmin>=nmin&&tree[i].nmax<=nmax) return;
if(tree[i].l==l&&tree[i].r==r){
nmin = min(tree[i].nmin,nmin);
nmax = max(tree[i].nmax,nmax);
return;
}
int mid=(tree[i].l+tree[i].r)/;
if(r<=mid) query(*i,l,r);
else if(l>mid) query(*i+,l,r);
else{
query(*i,l,mid);
query(*i+,mid+,r);
}
} int main(){
int n,q;
while(scanf("%d %d",&n,&q)!=EOF){
for(int i=;i<=n;i++) scanf("%d",&a[i]);
build_tree(,,n); while(q--){
nmin=INF;nmax=-INF;
int l,r;
scanf("%d %d",&l,&r);
query(,l,r);
printf("%d\n",nmax-nmin);
}
}
return ;
}
另外这道题用cin会超时
最新文章
- [LeetCode] Fizz Buzz 嘶嘶嗡嗡
- ios 尺寸
- 老王Python培训视频教程(价值500元)【基础进阶项目篇 &ndash; 完整版】
- hiho1091_clicker背包问题
- python 绘图工具 matplotlib 入门
- JDBC连接各种数据库的方法(经典)
- 一个inline-block的样式。
- ScrollView can host only one direct child 解决
- windows 进程间通讯方法
- 利用netstat和tasklist查看PC的端口占用情况
- SDL2源码分析6:拷贝到渲染器(SDL_RenderCopy())
- WebCollector 2.x 新手教程
- 转载 deep learning:八(SparseCoding稀疏编码)
- linux使用LVM合并硬盘
- DNS Prefetch初认识
- odoo Model字段的参数
- MVC(面试)
- Python文件学习
- 未能找到 CodeDom 提供程序类型“Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider,
- P1349 广义斐波那契数列(矩阵加速)