线段树 - 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 ...
随机推荐
- h5 禁止微信内置浏览器调整字体大小方法
ios 通过重写样式控制 body { -webkit-text-size-adjust:100%!important; } android 通过重写事件控制 (function() { if (ty ...
- C++中结构体与类的区别 1
转载来源:http://blog.sina.com.cn/s/blog_48f587a80100k630.html C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据 ...
- Imply.io单机安装
安装 wget https://static.imply.io/release/imply-2.5.15.tar.gz .tar.gz -C /usr/local/ cd imply- nohup b ...
- 安装OpenResty
./configure --prefix=/data/openresty_10002 --with-luajit --with-http_stub_status_module OpenResty,也被 ...
- Linux的bond模式绑定及模式区别
[Linux的bond模式配置] 原理: 多块网卡虚拟成一张,实现冗余:多张网卡对外显示一张,具有同一个IP: 工作在网卡是混杂模式的情况下: 对于多物理网卡的 Bond 网卡而言,其中一块物理网卡会 ...
- [Cpp primer] range for (c++11)
for (declaration : expression) statement; /* This statement will iterate through the elements in the ...
- git账户的存储
在使用git时,使用git pull,或git push,每次都要我输入用户名和密码,比较麻烦.git有个参数可以解决这个问题. 修改./git/config文件,增加 [credential] he ...
- 爬虫之 图片懒加载, selenium , phantomJs, 谷歌无头浏览器
一.图片懒加载 懒加载 : JS 代码 是页面自然滚动 window.scrollTo(0,document.body.scrollHeight) (重点) bro.execute_ ...
- 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& ...
- unit_2_homework
随记2018/4/23 # 找元祖中的元素,移除每个元素的空格,并查找以a或A开头,c结尾的所有元素. # 思路:将i取出来,求得li列表中有多少个元素for i in range(len(li)): ...