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

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

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

向左看把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. 第34课.数组操作符的重载("[]"重载)

    1.问题:string类对象还具备c方式字符串的灵活性吗?还能直接访问单个字符吗? 答案:可以按照c字符串的方式使用string对象 string s = "a1b2c3d4e"; ...

  2. kafka producer serializer序列化(六)

    生产者需要将要发送的数据转换成字节数组才能通过网络发送给kafka,对于一些简单的数据,kafka自带了一些序列化工具, 如:StringSerializer Double Long Integer ...

  3. 【青橙商城-管理后台开发】3. web模块搭建

    [青橙商城-管理后台开发]3. web模块搭建 1.创建qingcheng_web_manager模块 pom.xml <?xml version="1.0" encodin ...

  4. mybatis缓存机制与装饰者模式

    mybatis 缓存 MyBatis的二级缓存的设计原理 装饰者模式

  5. Mybatis Plus带多条件的多表联合、分页、排序查询

    目录 一.现有表 student学生表: facultylist学院表: 二.同时满足以下需求: 1.多表联合查询出学院名字 2.可以带多条件查询 3.指定页码,页数据大小进行物理分页查询 三.解决步 ...

  6. Kubernetes-Service(服务)

    ⒈引用 在Kubernetes中,pod通常需要对来自集群内部的其他pod或来自集群外部的客户端的HTTP请求做出响应.pod需要一种寻找其他pod的方法来使用其他pod提供的服务,不像在没有Kube ...

  7. 为什么要使用 SPL中的 SplQueue实现队列

    今天看php的SPL标准库部分里面涉及到数据结构其中有 SplQueue 来实现队列效果,但是我刚接触php的时候学习到的是 使用array的 array_push 和 array_pop 就可以实现 ...

  8. hdu 3371 有毒的卡时间题目

    同样的代码 每次交的结果都不一样 #include<stdio.h> #include<string.h> #include<stdlib.h> #include& ...

  9. postman中传参说明

    1.form-data 表单传递,对应multipart/form-data, 2.x-www-form-urlencoded 默认传递,对应application/x-www-from-urlenc ...

  10. git基本操作及实用工具

    //git1.安装客户端git Git-2.9.3-rebase-i-64-bit.exe2.安装完成后打开git bashgit config --global user.name "li ...