数据结构 单调栈+几何 摩天大楼【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 ...
最新文章
- R假设检验之Grubbs异常检测(Grubbs’ Test)
- 如何显示jQuery中的加载微调器?
- 高性能分布式计算与存储系统设计概要(上)(转)
- 在asp.net2.0下配置FCKeditor
- 深度学习之windows python faster rcnn 配置及demo运行
- .NET Core 2.1中改进的堆栈信息
- IO多路复用(select,poll,epoll)详解
- java 匿名内部类多态,下面这个简单的程序验证匿名内部类的多态属性,但出现错误。...
- 顺着IP地址他们能找到我家吗?
- iperf3带宽测试工具
- Clion设置背景图片
- 深圳中学高考2021成绩查询,2020深圳高中高考数据对比,明年考多少分能上好高中?...
- MVC中的ViewData、ViewBag和TempData
- git 使用meld 进行文本对比
- java邮箱发送验证码_java 邮箱发送验证码
- SpringDataJPA+Hibernate框架源码剖析(六)@PersistenceContext和@Autowired注入EntityManager的区别
- KeyError: ‘[1 2] not found in axis‘
- c语言中错误为ffblk未定义,C - 错误没有定义和存储未知
- 计算机网络——各种时延的计算
- GitHub Pages 自定义域名实践整理