线段树 - 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 ...
随机推荐
- MUI 支付宝支付接入
沙箱测试地址:https://openhome.alipay.com/platform/appDaily.htm 1资源下载地址:https://docs.open.alipay.com/54/106 ...
- appium+python自动化31-android_uiautomator定位
前言 appium就是封装android的uiautomator这个框架来的,所以uiautomator的一些定位方法也可以用 text 1.通过text文本定位语法 new UiSelector() ...
- Linux上面缺少rz和sz命令
一.centos系统没有自带rz/sz命令 yum install lrzsz 搞定! 二.对于经常使用Linux系统的人员来说,少不了将本地的文件上传到服务器或者从服务器上下载文件到本地,rz / ...
- ISIS与OSPF的区别与联系
共同之处: 1 都是链路状态路由协议,都要求区域内的路由器交换链路状态信息,链路状态信息被收集到链路状态数据库中 2 都是用了一种实现路由选择信息交换相似机制 3 都在广播网络中选择指定路由器来控制扩 ...
- Cesium有价值网址
//比较粗 https://www.cnblogs.com/mazhenyu/p/6494748.html //很详细 2019.4.19 https://www.cnblogs.com/fuckgi ...
- 跟我一起学kafka(二)
kafka安装到linux服务器中的情况较多,但是我们现在在学习当中,所以可以拿windows先试试手.要想学kafk那么必然要做一件事就是安装好kafka,下面我讲详细得windows下安装kafk ...
- BLE 周边设备断开
运行中,突然远程设备断开. TBluetoothLEDevice.IsConnected 为false了. 再次搜索,订阅, BluetoothLE1.SubscribeToCharacteristi ...
- FFmpeg库简介
1.FFmpeg基本组成 FFmpeg框架的基本组成包含AVFormat.AVCodec.AVFilter.AVDevice.AVUtils等模块库,如下图所示. libavformat:用于各种音视 ...
- hadoop学习记录1 初始hadoop
起因 因为工作需要用到,所以需要学习hadoop,所以记录这篇文章,主要分享自己快速搭建hadoop环境与运行一个demo 搭建环境 网上搭建hadoop环境的例子我看蛮多的.但是我看都比较复杂,要求 ...
- properties 中文乱码问题的解决
在用properties处理配置信息时,发现有时出现中文乱码的问题,后经查资料得知是由于编码不一致引起的.于是解决之. [原理解释] 我们用 API操作properties文件,如果获取的属性值是中文 ...