线段树 - 3264 Balanced Lineup
大略的的看了线段树的定义然后就开始练手, 可能很多地方可以优化, 仅供参考.
徘徊在AC的边缘, 提交代码要把cout/cin 缓存 printf/scanf 刚好能过.
#include <iostream>
using namespace std; #define MAXN 50010 struct Node{
int left,right;
int max,min;
Node * pleft,*pright;
Node():pleft(NULL),pright(NULL){}
Node(int l,int r):left(l),right(r),max(-),min(0x7fffffff),pleft(NULL),pright(NULL){}
}; struct Point{
int min;
int max;
Point(int ma,int mi):max(ma),min(mi){};
}; int heights[MAXN]; void build(Node*p){
if(p->left == p->right){
p->max = heights[p->left];
p->min = p->max;
return;
}
//calc the max and min value.
for (int i=p->left;i<=p->right;++i){
if(heights[i]>p->max)
p->max = heights[i];
if(heights[i]<p->min)
p->min = heights[i];
}
int mid = (p->left + p->right) >> ;
p->pleft = new Node(p->left,mid);
build(p->pleft);
p->pright= new Node(mid+,p->right);
build(p->pright);
} Point query(Node * p, int left,int right){
if(left==p->left && right == p->right)
return Point(p->max,p->min);
int mid = (p->left+p->right) >> ;
if(left > mid)
return query(p->pright,left,right);
else if(right <= mid)
return query(p->pleft,left,right);
else{
Point pl = query(p->pleft,left,mid);
Point pr = query(p->pright,mid+,right);
int tmin = pl.min < pr.min ? pl.min : pr.min;
int tmax = pl.max > pr.max ? pl.max : pr.max;
return Point(tmax,tmin);
}
} // for debug.
void dfs(Node * p){
if(p == NULL)
return;
cout<<"DFS TO: ["<<p->left<<", "<<p->right<<"] , ("<<p->max<<", "<<p->min<<")"<<endl;
dfs(p->pleft);
dfs(p->pright);
}
int main(){
int N,Q;
cin>>N>>Q;
for(int i=;i<N;++i){
cin>>heights[i];
}
Node * head = new Node(,N-);
build(head);
// dfs(head); int l,r;
for(int i=;i<Q;++i){
cin>>l>>r;
Point point = query(head,l-,r-);
cout<<point.max - point.min<<endl;
}
return ;
}
AC代码:
#include <stdio.h> #define MAXN 50010 struct Node{
int left,right;
int max,min;
Node * pleft,*pright;
Node():pleft(NULL),pright(NULL){}
Node(int l,int r):left(l),right(r),max(-),min(0x7fffffff),pleft(NULL),pright(NULL){}
}; struct Point{
int min;
int max;
Point(int ma,int mi):max(ma),min(mi){};
}; int heights[MAXN]; void build(Node*p){
if(p->left == p->right){
p->max = heights[p->left];
p->min = p->max;
return;
}
//calc the max and min value.
for (int i=p->left;i<=p->right;++i){
if(heights[i]>p->max)
p->max = heights[i];
if(heights[i]<p->min)
p->min = heights[i];
}
int mid = (p->left + p->right) >> ;
p->pleft = new Node(p->left,mid);
build(p->pleft);
p->pright= new Node(mid+,p->right);
build(p->pright);
} Point query(Node * p, int left,int right){
if(left==p->left && right == p->right)
return Point(p->max,p->min);
int mid = (p->left+p->right) >> ;
if(left > mid)
return query(p->pright,left,right);
else if(right <= mid)
return query(p->pleft,left,right);
else{
Point pl = query(p->pleft,left,mid);
Point pr = query(p->pright,mid+,right);
int tmin = pl.min < pr.min ? pl.min : pr.min;
int tmax = pl.max > pr.max ? pl.max : pr.max;
return Point(tmax,tmin);
}
} // for debug.
// void dfs(Node * p){
// if(p == NULL)
// return;
// cout<<"DFS TO: ["<<p->left<<", "<<p->right<<"] , ("<<p->max<<", "<<p->min<<")"<<endl;
// dfs(p->pleft);
// dfs(p->pright);
// }
int main(){
int N,Q;
scanf("%d%d",&N,&Q);
for(int i=;i<N;++i){
scanf("%d",&heights[i]);
}
Node * head = new Node(,N-);
build(head);
// dfs(head); int l,r;
for(int i=;i<Q;++i){
scanf("%d%d",&l,&r);
Point point = query(head,l-,r-);
printf("%d\n",point.max - point.min);
}
return ;
}
线段树 - 3264 Balanced Lineup的更多相关文章
- (线段树)Balanced Lineup --POJ --3264
链接: 对于POJ老是爆,我也是醉了, 链接等等再发吧! http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82832#problem/G 只 ...
- POJ 3264 Balanced Lineup 【ST表 静态RMQ】
传送门:http://poj.org/problem?id=3264 Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total S ...
- 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: 68466 Accepted: 31752 ...
- poj 3264:Balanced Lineup(线段树,经典题)
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 32820 Accepted: 15447 ...
- poj 3264 Balanced Lineup (线段树)
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 42489 Accepted: 20000 ...
- [POJ] 3264 Balanced Lineup [线段树]
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 34306 Accepted: 16137 ...
- 【POJ】3264 Balanced Lineup ——线段树 区间最值
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 34140 Accepted: 16044 ...
随机推荐
- 传输类型为 "multipart/form-data" 的传送写法 (上传文件 和图片)
一: 传字符的情况: 抓包数据: 传输的数据: python-request写法: 二:上传图片的情况:
- GC之八--GC 触发Full GC执行的情况及应对策略
目录: GC之一--GC 的算法分析.垃圾收集器.内存分配策略介绍 GC之二--GC日志分析(jdk1.8)整理中 GC之三--GC 触发Full GC执行的情况及应对策略 gc之四--Minor G ...
- Oracle归档与非归档模式
一.什么是Oracle归档模式 Oracle数据库有联机重做日志,这个日志是记录对数据库所做的修改,比如插入,删除,更新数据等,对这些操作都会记录在联机重做日志里.一般数据库至少要有2个联机重做日志组 ...
- Go - coding之前的准备
Go tool 的使用 Go的tool要求我们对于code有一定的结构化组织和管理,下面我们就来一介绍他们: --GoPath environment variable: 顾名思义,环境变量,指定了 ...
- Sqoop修改sqoop元信息实现job的增量导入
最简单方式是按主键增量导入:http://blog.csdn.net/ggz631047367/article/details/50185319 以下方法只做存档 需求:redis缓存的数据隔段时间往 ...
- 《Effective C++(第三版)》-笔记
1. 让自己习惯C++ 条款01: 视C++为一个语言联邦 1.1 C++ 是一个多重泛型编程语言(multiparadigm programming),支持:过程形式(procedural),面向对 ...
- oracle用户解锁
创建一个概要文件 create profile frank_profile limit SESSIONS_PER_USER 5 IDLE_TIME 2 FAILED_LOGIN_ ...
- Cobalt strike 第二节生成报告
0x00前言: 上一节我们说了怎么连接到服务器 0x01生成报告: 首先打开Cobalt Strike 点击Cobalt Strike -> Preferences Preferences Pe ...
- Ubuntu无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用)
结果终端提示:无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?” 解决办法如 ...
- 关于java中的OutOfMemory种类和解决方法
1.OutOfMemory的三种情况 1) 永久区溢出 Exception in thread "main" java.lang.OutOfMemoryError: PermGen ...