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

徘徊在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. h5 禁止微信内置浏览器调整字体大小方法

    ios 通过重写样式控制 body { -webkit-text-size-adjust:100%!important; } android 通过重写事件控制 (function() { if (ty ...

  2. C++中结构体与类的区别 1

    转载来源:http://blog.sina.com.cn/s/blog_48f587a80100k630.html C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据 ...

  3. Imply.io单机安装

    安装 wget https://static.imply.io/release/imply-2.5.15.tar.gz .tar.gz -C /usr/local/ cd imply- nohup b ...

  4. 安装OpenResty

    ./configure --prefix=/data/openresty_10002 --with-luajit --with-http_stub_status_module OpenResty,也被 ...

  5. Linux的bond模式绑定及模式区别

    [Linux的bond模式配置] 原理: 多块网卡虚拟成一张,实现冗余:多张网卡对外显示一张,具有同一个IP: 工作在网卡是混杂模式的情况下: 对于多物理网卡的 Bond 网卡而言,其中一块物理网卡会 ...

  6. [Cpp primer] range for (c++11)

    for (declaration : expression) statement; /* This statement will iterate through the elements in the ...

  7. git账户的存储

    在使用git时,使用git pull,或git push,每次都要我输入用户名和密码,比较麻烦.git有个参数可以解决这个问题. 修改./git/config文件,增加 [credential] he ...

  8. 爬虫之 图片懒加载, selenium , phantomJs, 谷歌无头浏览器

    一.图片懒加载 懒加载 :    JS 代码  是页面自然滚动    window.scrollTo(0,document.body.scrollHeight)   (重点) bro.execute_ ...

  9. URL里面的中文参数到底转换成了什么?

    https://www.amazon.cn/s/ref=nb_sb_noss?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99& ...

  10. unit_2_homework

    随记2018/4/23 # 找元祖中的元素,移除每个元素的空格,并查找以a或A开头,c结尾的所有元素. # 思路:将i取出来,求得li列表中有多少个元素for i in range(len(li)): ...