大略的的看了线段树的定义然后就开始练手, 可能很多地方可以优化, 仅供参考.

徘徊在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的更多相关文章

  1. (线段树)Balanced Lineup --POJ --3264

    链接: 对于POJ老是爆,我也是醉了, 链接等等再发吧! http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82832#problem/G 只 ...

  2. POJ 3264 Balanced Lineup 【ST表 静态RMQ】

    传送门:http://poj.org/problem?id=3264 Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total S ...

  3. Poj 3264 Balanced Lineup RMQ模板

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

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

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

  5. POJ - 3264——Balanced Lineup(入门线段树)

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 68466   Accepted: 31752 ...

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

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

  7. poj 3264 Balanced Lineup (线段树)

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 42489   Accepted: 20000 ...

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

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

  9. 【POJ】3264 Balanced Lineup ——线段树 区间最值

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 34140   Accepted: 16044 ...

随机推荐

  1. Hibernate学习3—映射对象标识符(OID)

    一.Hibernate 用对象标识符(OID)来区分对象 作如下代码的实验: public class StudentTest { public static void main(String[] a ...

  2. 操作系统-服务器-百科:Windows Server

    ylbtech-操作系统-服务器-百科:Windows Server Windows Server是微软在2003年4月24日推出的Windows 的服务器操作系统,其核心是Microsoft Win ...

  3. docker 远程rest api 访问配置

    Docker RestApi 的配置及使用 Centos Docker1.12 远程Rest api访问的配置方法 http restapiv1.24 docker sdk for python

  4. 小程序scroll-view组件使用时,子元素虽设置样式display:inline-flex;whit-space:nowrap

    小程序scroll-view组件使用时,子元素虽设置样式display:inline-flex;whit-space:nowrap

  5. 运维平台cmdb开发-day2

    一 发送数据到api(Django的URL) 发送请求携带参数 requests.get(url='http://127.0.0.1:8000/api/asset/?k1=123') # <Qu ...

  6. FBString

    folly/FBString.h fbstring is a drop-in replacement for std::string. The main benefit of fbstring is ...

  7. IntelliJ Idea使用scalatest

    背景:作为测试,开发写什么,测试自然就要测什么了,so = = 无scala基础,人较笨,折腾了两天才把环境弄好,如下: 一 IntelliJ Idea下载安装 这个真心是最简单的了 https:// ...

  8. j2EE框架collection

    在 Java2中,有一套设计优良的接口和类组成了Java集合框架Collection,使程序员操作成批的数据或对象元素极为方便.这些接口和类有很多对抽象数据类型操作的API,而这是我们常用的且在数据结 ...

  9. eclipse项目推送git

    引用:http://blog.csdn.net/zongzhankui/article/details/48653731

  10. congst与指针

    指向const的指针 //a pointer to const int;指针指向常量对象,相对本指针而言,不能指针指向的对象的常量,不能通过本指针修改常量对象指针,实际的对象不一定的常量 const指 ...