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

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

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

向左看把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. bitmap位图原理和实现

    引子 首先通过一道题来理解什么是bitmap. 题目:我有40亿个整数,再给一个新的整数,我需要判断新的整数是否在40亿个整数中,你会怎么做? 分析: 假设一个int占4个字节(32位),40个亿个整 ...

  2. uva11624 Fire! (bfs预处理)

    题目链接:https://vjudge.net/problem/UVA-11624 题意:给一个1000×1000的矩阵,有几个着火点和Joe,着火点和Joe每个单位时间均移动一个单位,求Joe逃出的 ...

  3. notepad++一次多行复制粘贴到对应位置

    NodePad++一次复制多行粘贴到对应位置 有时候要写sql,但是里面有很多字段要对应上,如果要自己一个字段一个字段的去写是在有点麻烦,是不是有更好的方法做到这件事呢? 要做这件事,首先分析下我们已 ...

  4. Web应用中访问WEB-INF下的资源

    WEB-INF目录是出于保护资源文件的目的,只能我们开发人员自己查看不可以通过URL直接访问的: 有时候我们也想直接访问WEB-INF中的资源,那就需要用到请求转发了(重定向redirect是不可以的 ...

  5. python 入门(基础)

    1. python的常见数据类型(str , list ,dict,set) str (字符串的操作方法) astr = " Hello Workd " astr.strip() ...

  6. 【Python基础】12_Python中的容器类型公共方法

    1.Python中的内置函数 注:比较两个值,使用 <. >. == 2.切片 注:字典是一个无序集合,不能切片 3.运算符 字典中的in .not in  对字段操作时,只能判断字典的k ...

  7. python基础(十)--函数进阶

    嵌套函数 >>> graphic = '三角形' >>> def chang(): graphic = '正方形' def chang1(): #内部嵌套的函数命名 ...

  8. Python 面向对象编程详解

    Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...

  9. android中sqlite数据库的基本使用和添加多张表

    看了很多关于android使用sqlite数据库的文章,很多都是介绍了数据库的建立和表的建立,而表通常都是只建立一张,而实际情况我们用到的表可能不止一张,那这种情况下我们又该怎么办呢,好了,下面我教大 ...

  10. springMVC接受json类型数据

    springMVC接受json格式的数据很简单 使用@RequestBody 注解,标识从请求的body中取值 服务端示例代码 @RequestMapping(value = "/t4&qu ...