HDU 5033

题目大意:

就是一个人来到充满摩天大楼的城市,所有大楼没有宽度。建一直角坐标系,给出每个建筑的高度,现在求人站在(x,0)处能够看到天空的范围。(即不被摩天大楼阻挡)。答案只需要给出视角大小。
还是想了一会才想出。.对于一个人能看到的左界,我们可以得到下式:

kmaxxi=min((Hj−Hi)/(Xj−Xi)),j<=i k m a x x i = m i n ( ( H j − H i ) / ( X j − X i ) ) , j <= i

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 】相关推荐

  1. [数据结构]——单调栈

    单调栈 笔者在做leetcode的题(下一个出现的最大数字)时,接触到了单调栈这一种数据结构,经过研究之后,发现单调栈在解决某些问题时出奇的好用,下面是对单调栈的性质和一些典型题目. 什么是单调栈? ...

  2. 数据结构 - 单调栈、单调队列

    单调栈:每日温度 请根据每日 气温 列表 temperatures ,请计算在每一天需要等几天才会有更高的温度.如果气温在这之后都不会升高,请在该位置用 0 来代替 单调栈基本只处理NGE问题(Nex ...

  3. 股票价格跨度--单调栈

    leetcode 901:力扣 今天做这道题时,第一次了解到单调栈这种方法,就是用栈维护一个单调递增或单调递减的序列 本题,需要找到的是一个股票价格的跨度,常规想法就是从后往前查找,对小于等于当前股票 ...

  4. 0x11.基本数据结构 — 栈与单调栈

    目录 一.栈 0.AcWing 41. 包含min函数的栈 (自己造栈) 1.AcWing 128. 编辑器 (对顶栈) 2.AcWing 129. 火车进栈 3.AcWing 130. 火车进出栈问 ...

  5. 数据结构录 之 单调队列单调栈。

    队列和栈是很常见的应用,大部分算法中都能见到他们的影子. 而单纯的队列和栈经常不能满足需求,所以需要一些很神奇的队列和栈的扩展. 其中最出名的应该是优先队列吧我觉得,然后还有两种比较小众的扩展就是单调 ...

  6. 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] 内 " ...

  7. HDU 6194 后缀数组+单调栈

    题意: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6194 找到一个字符串中恰好出现k次的子串的数目. 思路: 计算出height数组,根据heig ...

  8. HDU 1506 解题报告 Largest Rectangle in a Histogram (单调栈)

    看题传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1506 题意比较明显,就是找以某一个矩形为高的最大的矩形.这个题可以用单调栈来求解,需要注意的是如果从 ...

  9. 蒟蒻的ACM数据结构(四)-单调队列和单调栈

    单调队列和单调栈 一.概念 二.实现 三.题目 单调队列 洛谷P1886 滑动窗口 解析 单调栈 [GXOI/GZOI2019]与或和 解析 POJ3250 Bad Hair Day 解析 POJ 2 ...

最新文章

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

热门文章

  1. [转转]反调试技巧总结-原理和实现-----转
  2. SAAS云平台搭建札记: (一)浅论SAAS多租户自助云服务平台的产品、服务和订单
  3. C语言中的getchar()与putchar()详解
  4. MVC及MVVM架构
  5. 那要怎么找到图片URL呢
  6. 存储圈要“挂帅点将”,谁能挑起数智融合发展重担?
  7. 图像处理之灰度图像转换与二值化
  8. Hystrix 服务熔断
  9. python鼠标键盘同时监听
  10. opencv如何在图像上画框