题意:有一排建筑,每座建筑有一定的高度,宽度可以忽略,求在某点的平地上能看到天空的最大角度。

网上的做法基本都是离线的...其实这道题是可以在线做的。

对于向右能看到的最大角度,从右往左倍增维护每个时刻的单调栈(凸壳),对于每个询问,先二分找到它右面的第一个建筑的位置,然后在对应的凸壳上倍增找到切点即可。

向左看把x坐标对称一下就行。

复杂度$O(nlogn)$

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
const db pi=acos(-);
const int N=1e5+,inf=0x3f3f3f3f;
int n,m,ka;
struct P {
db x,y;
P operator-(const P& b) {return {x-b.x,y-b.y};}
db rad() {return atan2(y,x);}
bool operator<(const P& b)const {return x<b.x;}
} a[N];
struct D {
P p,v;
bool operator<(const D& b)const {return p<b.p;}
};
db cross(const P& a,const P& b) {return a.x*b.y-a.y*b.x;}
struct Solver {
int F[N][];
D b[N];
void build(P* a) {
b[n]= {a[n],{,-}};
for(int i=; i<n; ++i)b[i]= {a[i],a[i+]-a[i]};
for(int k=; k>=; --k)F[n][k]=n;
for(int i=n-; i>=; --i) {
int j=i+;
if(cross(b[j].p-a[i],b[j].v)>) {
for(int k=; k>=; --k)
if(cross(b[F[j][k]].p-a[i],b[F[j][k]].v)>)j=F[j][k];
j=F[j][];
}
F[i][]=j;
b[i].v=a[j]-a[i];
for(int k=; k<; ++k)F[i][k]=F[F[i][k-]][k-];
}
}
db qry(P px) {
int i=lower_bound(b+,b++n,(D) {px, {,}})-b;
if(cross(b[i].p-px,b[i].v)>) {
for(int k=; k>=; --k)
if(cross(b[F[i][k]].p-px,b[F[i][k]].v)>)i=F[i][k];
i=F[i][];
}
return (b[i].p-px).rad()*/pi;
}
} solver[];
int main() {
int T;
for(scanf("%d",&T); T--;) {
printf("Case #%d:\n",++ka);
scanf("%d",&n);
for(int i=; i<=n; ++i)scanf("%lf%lf",&a[i].x,&a[i].y);
a[++n]= {~inf,},a[++n]= {inf,};
sort(a+,a++n);
solver[].build(a);
for(int i=; i<=n; ++i)a[i]= {-a[i].x,a[i].y};
reverse(a+,a++n);
solver[].build(a);
for(scanf("%d",&m); m--;) {
db x;
scanf("%lf",&x);
printf("%.10f\n",-(solver[].qry({x,})+solver[].qry({-x,})));
}
}
return ;
}

HDU - 5033 Building (单调栈+倍增)的更多相关文章

  1. HDU 5033 Building(单调栈)

    HDU 5033 Building(单调栈) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5033 Description Once upon a ti ...

  2. hdu 5033 Building (单调栈 或 暴力枚举 )

    Description Once upon a time Matt went to a small town. The town was so small and narrow that he can ...

  3. HDU 5033 Building(单调栈维护凸包)

    盗张图:来自http://blog.csdn.net/xuechelingxiao/article/details/39494433 题目大意:有一排建筑物坐落在一条直线上,每个建筑物都有一定的高度, ...

  4. hdu - 5033 - Building(单调栈)

    题意:N 幢楼排成一列(1<=N<=10^5),各楼有横坐标 xi(1<=xi<=10^7) 以及高度 hi(1<=hi<=10^7),在各楼之间的Q个位置(1&l ...

  5. HDU 5033 Building(北京网络赛B题) 单调栈 找规律

    做了三天,,,终于a了... 11724203 2014-09-25 09:37:44 Accepted 5033 781MS 7400K 4751 B G++ czy Building Time L ...

  6. HDU 5033 Building (维护单调栈)

    题目链接 题意:n个建筑物,Q条询问,问所在的位置,看到天空的角度是多少,每条询问的位置左右必定是有建筑物的. 思路 : 维护一个单调栈,将所有的建筑物和所有的人都放到一起开始算就行,每加入一个人,就 ...

  7. hdu 5033 模拟+单调优化

    http://acm.hdu.edu.cn/showproblem.php?pid=5033 平面上有n个建筑,每个建筑由(xi,hi)表示,m组询问在某一个点能看到天空的视角范围大小. 维护一个凸包 ...

  8. Largest Rectangle in a Histogram HDU - 1506 (单调栈)

    A histogram is a polygon composed of a sequence of rectangles aligned at a common base line. The rec ...

  9. HDU5033 building 单调栈+计算几何

    正解:单调栈 解题报告: 哇生气辽QAQ本来打了半天feel good都快调出来了然后说换题了QAQ(所以可能那题的代码会过一阵子再放上来了QAQ 不过还是大爆手速打了一通拿到首杀了嘻嘻 美滋滋辽 然 ...

随机推荐

  1. TensorFlow.训练_资料(有视频)

    ZC:自己训练 的文章 貌似 能度娘出来很多,得 自己弄过才知道哪些个是坑 哪些个好用...(在CSDN文章的右侧 也有列出很多相关的文章链接)(貌似 度娘的关键字是"TensorFlow ...

  2. ZOJ Problem Set - 1010

    算法:已知多边形各顶点坐标,求多边形面积的公式 http://www.cnblogs.com/FleetingTime/p/3849957.html http://www.mathchina.net/ ...

  3. zTree入门使用

    简单入门使用,熟悉其功能,没有与异步调用后台数据,用的是本地设置的数据. zTree的API:http://www.treejs.cn/v3/api.php 源码:https://github.com ...

  4. [转帖]三款Nehalem至强5500塔式服务器横评对决(4)

    三款Nehalem至强5500塔式服务器横评对决(4) http://tech.sina.com.cn/b/2009-12-14/05051172233_4.shtml 可以看到两路服务器的设置 基本 ...

  5. windows 清理 cbs.log 文件

    请参考以下步骤 1.win+r输入 services.msc进入服务,找到并双击Windows Modules Installer点击停止, 2.然后就可以手动删除 3.按一的步骤开启TrustedI ...

  6. JS利用async、await处理少见的登录业务逻辑

    在用uniapp开发一个项目时,有这样一个需求:用户首次登录后,uniapp自动保存用户名密码,之后不管是再次打开项目(打开项目时登录状态已失效)还是 请求接口(接口返回登录失效)时,都会先自动默认的 ...

  7. 小菜鸟之oracle

    oracle 存储过程 函数 创建 删除 参数 传递 函数 查看 包 系统包 分类: Oracle 2011-10-27 17:31 264人阅读 评论(0) 收藏 举报   认识存储过程和函数 存储 ...

  8. Hadoop集群搭建-01前期准备

    Hadoop集群搭建-05安装配置YARN Hadoop集群搭建-04安装配置HDFS  Hadoop集群搭建-03编译安装hadoop Hadoop集群搭建-02安装配置Zookeeper Hado ...

  9. Mac安装postgresql和卸载PostgreSQL

    1.homebrew安装 brew install postgresql 2.初始化 initdb /usr/local/var/postgres 3.创建数据库及查看数据库 (1)先创建db. cr ...

  10. 关于使用pietty或putty终端连接ubuntu虚拟机时报被拒绝连接问题

    首先如果要使用终端进行远程连接的ubuntu虚拟机的话,必须保证其虚拟机ip能在window下ping的动.具体的ubuntu网络配置这里不再讲,我这里使用的是NAT连接. 然后检查ssh服务是否有安 ...