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. 1.spring:helloword/注入/CDATA使用/其他Bean/null级联/p命名空间
  2. Kafka项目实战-用户日志上报实时统计之编码实践
  3. Microsoft Dynamics CRM 数据库连接存储位置在哪里 是在注册表里
  4. 北大OJ(POJ 2808)校门外的树
  5. root用户安装的软件在普通用户不生效
  6. 君子抉(4月28日)
  7. Scrum Meeting 2 (2016-12-19 Mon)
  8. WIN10系统——打开PB的帮助文档
  9. Sublime Text for Mac如何支持GBK编码
  10. SpringBoot整合Memcached
  11. php判断信用卡,PHP函数验证信用卡卡号是否正确
  12. MATLAB基础速成
  13. Ubuntu18.04为EW-7822ULC网卡安装驱动
  14. 程序员:耐得住寂寞,禁得住诱惑
  15. java计算器取负数_JAVA-复数计算器
  16. visio常用快捷键_Visio实用快捷键+比较不错的总结
  17. 高通ims架构android,深度揭密高通4/5G移动基带消息系统和状态机
  18.  php怎么做注册短信验证码
  19. CPU结构及工作原理
  20. 微信企业号开发实例源码

热门文章

  1. 利用mathematica模拟炮弹轨迹
  2. vnc配置和display操作(杂)
  3. 日期插件mobiscroll_date使用
  4. 《见识》最后一章:巴菲特午餐:人生的智慧
  5. “毒舌”专家解析大数据应用案例Part2—三星盖乐世社区 DSP跨屏投放
  6. 对于这只已经上市的「狗」,王小川认为一切只是新的开始
  7. 狗熊掰棒子及井底之蛙
  8. 我用泡妹子追 MM 的技术学会了 23 种设计模式!
  9. python用函数绘制椭圆_详解opencv中画圆circle函数和椭圆ellipse函数
  10. 2022-2028年全球与中国皮卡行业市场前瞻与投资战略规划分析