HDU 5033 Building (维护单调栈)
题意:n个建筑物,Q条询问,问所在的位置,看到天空的角度是多少,每条询问的位置左右必定是有建筑物的。
思路 : 维护一个单调栈,将所有的建筑物和所有的人都放到一起开始算就行,每加入一个人,就维护栈里的建筑物的高度,也就是说这个人所能够看到的建筑物时在栈里的,但是这个人看不到的就删掉,例如下图,中间三个点可以删掉了,因为角度问题中间三个是看不到的,所以不会影响最终求得角度

还有一种情况,就是下述的情况,不停的维护单调栈,人站在不同的地方角度也是不一样的。

维护的是相邻两建筑顶(xi,hi)的连线的斜率的绝对值上升 的单调栈。
从左往右一遍,右往左一遍。
下图是代码中judge函数的图,要判断是否建筑物被另一建筑物遮挡。

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <iostream>
#include <stack>
#include <algorithm>
#define PI acos(-1.0)
using namespace std ; struct node
{
int pos ;
int height ;
bool operator <(const node &a)const
{
return pos < a.pos ;
}
} p[],stk[];
double sh[] ;
int T,n,q; int judge(node &a,node &b,node c){//判断在c处的视野中,a建筑物是否能够在c处没有被b建筑物挡住
if(c.height <= ) c.height = ;
return (long long)(a.height-c.height)*(c.pos-b.pos) >= (long long)(b.height-c.height)*(c.pos-a.pos) ;
} double angle(node a,node b)//求a建筑物与b处所成角的大小
{
return atan((double)(b.pos-a.pos)/(double)(a.height)) ;
}
void solve()
{
int top = ;
for(int i = ; i < n+q ; i ++){
if(p[i].height <= ){//是人的地方
while(top >= && judge(stk[top-],stk[top-],p[i])) top -- ;//如果top-1挡不住top-2的话,说明top-1在角度贡献上没什么用
sh[-p[i].height] += angle(stk[top-],p[i]) ;
}
else
{
while(top && stk[top-].height <= p[i].height) top-- ;//如果栈顶元素没有新的这个高,那么肯定会被挡到,所以没有用删掉
while(top >= && judge(stk[top-],stk[top-],p[i])) top--;//把这三个建筑物的最高点相连,若是凹的,中间那个肯定会被挡到,删掉
stk[top++] = p[i] ;
}
}
}
int main()
{
scanf("%d",&T) ;
int casee = ;
while(T--)
{
scanf("%d",&n) ;
for(int i = ; i < n ; i++)
{
scanf("%d %d",&p[i].pos,&p[i].height) ;
}
scanf("%d",&q) ;
for(int i = ; i < q ; i++)
{
scanf("%d",&p[i+n].pos) ;
p[i+n].height = -i ;//输出方便
}
memset(sh,,sizeof(sh)) ;
sort(p,p+n+q) ;
solve() ;
reverse(p,p+n+q) ;
for(int i = ; i < n+q ; i++)//把后边的全部都移到前边去,与上边的统一,方便调用函数
p[i].pos = -p[i].pos ;
solve() ;
printf("Case #%d:\n",casee++) ;
for(int i = ; i < q ; i++){
printf("%.10lf\n",sh[i]*/PI) ;//角度与弧度的转化
}
}
return ;
}
HDU 5033 Building (维护单调栈)的更多相关文章
- hdu - 5033 - Building(单调栈)
题意:N 幢楼排成一列(1<=N<=10^5),各楼有横坐标 xi(1<=xi<=10^7) 以及高度 hi(1<=hi<=10^7),在各楼之间的Q个位置(1&l ...
- HDU 5033 Building --离线+单调栈
题意:给一些建筑物,x表示横坐标,h表示高度,然后查询某些坐标x,问从该点看向天空的最大张角是多大. 解法:离线操作,读入所有数据,然后按x升序排序,对每一个查询的x,先从左到右,依次添加x坐标小于x ...
- hdu 5033 buiding(单调栈)
hdu 5033 buiding(单调栈) 某年某月某天,马特去了一个小镇.这个小镇如此狭窄,以至于他可以把小镇当作一个枢纽.在镇上有一些摩天大楼,其中一栋位于xi,高度为hi.所有的摩天大楼位于不同 ...
- HDU 5033 Building(单调栈)
HDU 5033 Building(单调栈) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5033 Description Once upon a ti ...
- HDU 5033 Building(北京网络赛B题) 单调栈 找规律
做了三天,,,终于a了... 11724203 2014-09-25 09:37:44 Accepted 5033 781MS 7400K 4751 B G++ czy Building Time L ...
- hdu5033 Building (单调栈+)
http://acm.hdu.edu.cn/showproblem.php?pid=5033 2014 ACM/ICPC Asia Regional Beijing Online B 1002 Bui ...
- 【洛谷5294】[HNOI2019] 序列(主席树维护单调栈+二分)
点此看题面 大致题意: 给你一个长度为\(n\)的序列\(A\),每次询问修改一个元素(只对当前询问有效),然后让你找到一个不下降序列\(B\),使得这两个序列相应位置之差的平方和最小,并输出这个最小 ...
- [CSP-S模拟测试]:陶陶摘苹果(线段树维护单调栈)
题目传送门(内部题116) 输入格式 第一行两个整数$n,m$,如题 第二行有$n$个整数表示$h_1-h_n(1\leqslant h_i\leqslant 10^9)$ 接下来有$m$行,每行两个 ...
- hdu 5033 Building (单调栈 或 暴力枚举 )
Description Once upon a time Matt went to a small town. The town was so small and narrow that he can ...
随机推荐
- ACM学习历程—HDU5696 区间的价值(分治 && RMQ && 线段树 && 动态规划)
http://acm.hdu.edu.cn/showproblem.php?pid=5696 这是这次百度之星初赛2B的第一题,但是由于正好打省赛,于是便错过了.加上2A的时候差了一题,当时有思路,但 ...
- ACM学习历程—HDU5668 Circle(数论)
http://acm.hdu.edu.cn/showproblem.php?pid=5668 这题的话,假设每次报x个,那么可以模拟一遍, 假设第i个出局的是a[i],那么从第i-1个出局的人后,重新 ...
- 手机访问PC网站自动跳转到手机网站代码(转)
4G时代,手机网站已经非常普遍了,一般手机网站都有一个二级域名来访问,比如 m.16css.com 如果手机直接访问www.16css.com 就是PC网站,在手机上浏览电脑版网站体验非常不好. 如果 ...
- What makes an inferred latch? how To avoid creating inferred latches? when do you know you need latches?
What makes an inferred latch?For combinatorial logic, the output of the circuit is a function of inp ...
- 拨打电话demo
- (IBAction)btnClick:(id)sender { UIActionSheet *action = [[UIActionSheet alloc] initWithTitle:nil d ...
- Angular5学习笔记 - 服务优化(十)
一.服务合并 二.验证效果
- 在ThinkPHP的common.php文件里添加公共函数的注意事项
注意事项: 1.函数不要加public访问控制权限,因为默认就是public的. 2.当你写好了一个新函数后在本地运行发现没有问题,但是在生产环境运行会报错:找不到这个函数,解决方法是删除runtim ...
- openwrt 按下回车才能显示图标信息
如题所示,openwrt启动后,手动才能按下系统图标和信息. 如何却掉这个手动选项呢? 修改文件/SISP-L26.7.8-OpenWrt/build_dir/target-arm_uClibc-0. ...
- Swing编程把图片放入frame里。先不作为背景图片
总结: 总之遵循一条,所有的组件都不是直接放入frame里的.还要label的重要性,panel.面板类 虽然我还是不会做,但总算出了个图片出来~~~~~~~~~~~~~ package com.kk ...
- Java-API-POI-Excel:HSSFWorkbook Documentation
ylbtech-Java-API-POI-Excel:HSSFWorkbook Documentation 1.返回顶部 1. org.apache.poi.hssf.usermodel Class ...