数据结构 单调栈+几何 摩天大楼【HDU 5033 】
HDU 5033
题目大意:
就是一个人来到充满摩天大楼的城市,所有大楼没有宽度。建一直角坐标系,给出每个建筑的高度,现在求人站在(x,0)处能够看到天空的范围。(即不被摩天大楼阻挡)。答案只需要给出视角大小。
还是想了一会才想出。.对于一个人能看到的左界,我们可以得到下式:
kmaxx_i=min((H_j-H_i)/(X_j-X_i)),j
用求出左界的斜率即可反解该范围的视角的角。而求最小即用单调栈维护斜率单减即可。右界同理可得。
有SPJ虚什么精度差?
#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=1000100,inf=1e9;
const double pi=3.1415926535;
int t,n,cnt;
stack <pair<int,double> > s;//第一个是当前元素编号,第二个是与上一个元素的斜率。
struct node{int x,h,bian;double l,r;
}a[maxn];
bool cmp(node p,node q){return p.x<q.x;
}
bool cmp2(node p,node q){return p.bian<q.bian;
}
double getk(int x,int y){double x1=a[x].x,x2=a[y].x,y1=a[x].h,y2=a[y].h;return (y2-y1)/(x2-x1);
}
int main(){int i,j,q;double k,a1,a2;scanf("%d",&t);for(j=1;j<=t;j++){scanf("%d",&n);printf("Case #%d\n",j);cnt=0;for(i=1;i<=n;i++){scanf("%d%d",&a[i].x,&a[i].h);a[i].bian=inf;//大楼的编号为正无穷 }cnt=n;scanf("%d",&q);for(i=1;i<=q;i++){cnt++;scanf("%d",&a[cnt].x);a[cnt].bian=i;a[cnt].h=0;}sort(a+1,a+cnt+1,cmp);//把人和摩天大楼同时排序,不用分类讨论。 while(!s.empty())s.pop();for(i=1;i<=cnt;i++){//求左界,维护斜率单减 while(!s.empty()){k=getk(s.top().first,i);if(k>=s.top().second)s.pop();else break;}if(s.empty()){a[i].l=0;s.push(make_pair(i,double(inf)));}else {a[i].l=getk(s.top().first,i);s.push(make_pair(i,a[i].l));}}while(!s.empty())s.pop();for(i=cnt;i>=1;i--){//求右界,维护斜率单增 while(!s.empty()){k=getk(s.top().first,i);if(k<=s.top().second)s.pop();else break;}if(s.empty()){a[i].r=0;s.push(make_pair(i,double(-inf)));}else {a[i].r=getk(s.top().first,i);s.push(make_pair(i,a[i].r));}}sort(a+1,a+cnt+1,cmp2);for(i=1;i<=q;i++){a1=atan(abs(a[i].l));a2=atan(abs(a[i].r));printf("%.10lf\n",(pi-a1-a2)/pi*180);}}return 0;
}
数据结构 单调栈+几何 摩天大楼【HDU 5033 】相关推荐
- [数据结构]——单调栈
单调栈 笔者在做leetcode的题(下一个出现的最大数字)时,接触到了单调栈这一种数据结构,经过研究之后,发现单调栈在解决某些问题时出奇的好用,下面是对单调栈的性质和一些典型题目. 什么是单调栈? ...
- 数据结构 - 单调栈、单调队列
单调栈:每日温度 请根据每日 气温 列表 temperatures ,请计算在每一天需要等几天才会有更高的温度.如果气温在这之后都不会升高,请在该位置用 0 来代替 单调栈基本只处理NGE问题(Nex ...
- 股票价格跨度--单调栈
leetcode 901:力扣 今天做这道题时,第一次了解到单调栈这种方法,就是用栈维护一个单调递增或单调递减的序列 本题,需要找到的是一个股票价格的跨度,常规想法就是从后往前查找,对小于等于当前股票 ...
- 0x11.基本数据结构 — 栈与单调栈
目录 一.栈 0.AcWing 41. 包含min函数的栈 (自己造栈) 1.AcWing 128. 编辑器 (对顶栈) 2.AcWing 129. 火车进栈 3.AcWing 130. 火车进出栈问 ...
- 数据结构录 之 单调队列单调栈。
队列和栈是很常见的应用,大部分算法中都能见到他们的影子. 而单纯的队列和栈经常不能满足需求,所以需要一些很神奇的队列和栈的扩展. 其中最出名的应该是优先队列吧我觉得,然后还有两种比较小众的扩展就是单调 ...
- HDU多校4 - 6989 Didn‘t I Say to Make My Abilities Average in the Next Life?!(单调栈)
题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,再给出 mmm 次询问,每次询问给出一个区间 [l,r][l,r][l,r],要求输出区间 [l,r][l,r][l,r] 内 " ...
- HDU 6194 后缀数组+单调栈
题意: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6194 找到一个字符串中恰好出现k次的子串的数目. 思路: 计算出height数组,根据heig ...
- HDU 1506 解题报告 Largest Rectangle in a Histogram (单调栈)
看题传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1506 题意比较明显,就是找以某一个矩形为高的最大的矩形.这个题可以用单调栈来求解,需要注意的是如果从 ...
- 蒟蒻的ACM数据结构(四)-单调队列和单调栈
单调队列和单调栈 一.概念 二.实现 三.题目 单调队列 洛谷P1886 滑动窗口 解析 单调栈 [GXOI/GZOI2019]与或和 解析 POJ3250 Bad Hair Day 解析 POJ 2 ...
最新文章
- 1.spring:helloword/注入/CDATA使用/其他Bean/null级联/p命名空间
- Kafka项目实战-用户日志上报实时统计之编码实践
- Microsoft Dynamics CRM 数据库连接存储位置在哪里 是在注册表里
- 北大OJ(POJ 2808)校门外的树
- root用户安装的软件在普通用户不生效
- 君子抉(4月28日)
- Scrum Meeting 2 (2016-12-19 Mon)
- WIN10系统——打开PB的帮助文档
- Sublime Text for Mac如何支持GBK编码
- SpringBoot整合Memcached
- php判断信用卡,PHP函数验证信用卡卡号是否正确
- MATLAB基础速成
- Ubuntu18.04为EW-7822ULC网卡安装驱动
- 程序员:耐得住寂寞,禁得住诱惑
- java计算器取负数_JAVA-复数计算器
- visio常用快捷键_Visio实用快捷键+比较不错的总结
- 高通ims架构android,深度揭密高通4/5G移动基带消息系统和状态机
- php怎么做注册短信验证码
- CPU结构及工作原理
- 微信企业号开发实例源码