Mission

著名的手机网络运营商Totalphone 修建了若干基站收发台,以用于把信号网络覆盖一条新建的高速公路。因为Totalphone 的程序员总是很马虎的,所以,基站的传功功率不能独立设置,只能将所有新基站的功率设置为一个相同的值。为了让能源的消耗尽量少,公司希望知道公路中任意点到最近基站距离的最大值。

输入的第一行包括两个整数N(1<=N<=10^6)和L(1<=L<=10^9)分别表示基站收发台的数量和高速公路的长度。接下来N行,每行包含一对整数xi,yi(-10^9<=xi,yi<=10^9)描述一个基站的坐标。所有给出的点都互不相同。点按照x坐标不下降排列。如果两个点的x坐标相同,那么它们之间按照y坐标的升序排列。

高速公路是一条从(0,0) 到(L,0) 的直线线段。

Solution

先说说O(n∗log)的做法,很显然出题人是卡这种做法的。

二分答案,然后O(n)扫一遍判断n个圆是否覆盖了高速公路。


考虑到只有两点之间中垂线与公路交点(或公路端点)才有可能贡献。

我们利用一个单调栈,维护相邻的点之间的中垂线与公路交点的横坐标单调递增,

最后扫一遍栈内元素得出答案。



如图,那么B点是没有用的,因为能够贡献的区段位于E点之前,D点之后,是空集。

Code

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#define ll long long
#define db double
using namespace std;
const char* fin="mobile.in";
const char* fout="mobile.out";
const int inf=0x7fffffff;
const int maxn=1000007;
const db eps=10e-10;
int n,m,i,j,k;
int equ(db a,db b){return fabs(a-b)<=eps?0:(a>b?1:-1);}
struct P{
db x,y;
P(db _x=0,db _y=0){x=_x;y=_y;}
P operator +(P b){return P(x+b.x,y+b.y);}
P operator -(P b){return P(x-b.x,y-b.y);}
P operator *(db b){return P(x*b,y*b);}
db operator ^(P b){return x*b.y-y*b.x;}
P per(){return P(y,-x);}
}a[maxn],b[maxn],c[maxn];
struct L{
P p,v;
L(){}
L(P _p,P _v){p=_p;v=_v;}
}L0; /*P ict(L a,L b){return b.p+b.v*(((a.p-b.p)^a.v)/(b.v^a.v));}
P x0(P a,P b){return ict(L(P((a.x+b.x)/2,(a.y+b.y)/2),(b-a).per()),L0);}*/
P x0(P a,P b){return P((b.x*b.x+b.y*b.y-a.x*a.x-a.y*a.y)/2/(b.x-a.x),0);}
db dist(P a,P b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));} int read(){
int x=0,i=1;
char ch=getchar();
while (ch<'0' || ch>'9'){
if (ch=='-') i=-1;
ch=getchar();
}
while (ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
return x*i;
}
int main(){
freopen(fin,"r",stdin);
freopen(fout,"w",stdout);
n=read();m=read();
L0=L(P(0,0),P(m,0));
int N=0;
for (i=1;i<=n;i++){
j=read();
k=read();
if (!N || equ(j*1.0,a[N].x)) a[++N]=P(j,k);
else if (abs(k)<fabs(a[N].y)) a[N].y=k;
}
n=N;
db l1=10e10,l2=10e10;
P tmp,tmd;
N=0;
if (n==1){
l1=dist(L0.p,a[1]);
l2=dist(L0.v,a[1]);
}else{
b[++N]=a[1];
l1=min(l1,dist(L0.p,a[1]));
l2=min(l2,dist(L0.v,a[1]));
b[++N]=a[2];
l1=min(l1,dist(L0.p,a[2]));
l2=min(l2,dist(L0.v,a[2]));
c[N-1]=x0(a[1],a[2]);
for (i=3;i<=n;i++){
while (N>1){
tmd=x0(b[N],a[i]);
if (equ(c[N-1].x,tmd.x)<=0) break;
N--;
}
c[N]=tmd;
b[++N]=a[i];
l1=min(l1,dist(L0.p,a[i]));
l2=min(l2,dist(L0.v,a[i]));
}
}
db ans=max(l1,l2);
for (i=1;i<N;i++){
if (equ(c[i].x,0.0)>=0 && equ((c[i].x),m*1.0)<=0)
ans=max(ans,dist(c[i],b[i]));
}
printf("%.3lf\n",ans);
return 0;
}

Warning

1.卡常

1)求交时请一步得解,不要用什么向量求交。

2)读入优化。

【JZOJ3636】【BOI2012】Mobile(mobile)的更多相关文章

  1. 【原创分享·微信支付】 C# MVC 微信支付教程系列之扫码支付

    微信支付教程系列之扫码支付                  今天,我们来一起探讨一下这个微信扫码支付.何为扫码支付呢?这里面,扫的码就是二维码了,就是我们经常扫一扫的那种二维码图片,例如,我们自己添 ...

  2. 【原创分享·微信支付】 C# MVC 微信支付教程系列之公众号支付

    微信支付教程系列之公众号支付         今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付.现在,我们讲讲这个公众号支付.公众号支付的应用环境常见的用户通过公众号,然后再通 ...

  3. 【原创分享·微信支付】C# MVC 微信支付之微信模板消息推送

    微信支付之微信模板消息推送                    今天我要跟大家分享的是“模板消息”的推送,这玩意呢,你说用途嘛,那还是真真的牛逼呐.原因在哪?就是因为它是依赖微信生存的呀,所以他能不 ...

  4. Web 开发人员和设计师必读文章推荐【系列二十九】

    <Web 前端开发精华文章推荐>2014年第8期(总第29期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...

  5. Web 前端开发人员和设计师必读精华文章【系列二十六】

    <Web 前端开发精华文章推荐>2014年第5期(总第26期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...

  6. Python之路【第十九篇】:爬虫

    Python之路[第十九篇]:爬虫   网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用 ...

  7. 57. Spring 自定义properties升级篇【从零开始学Spring Boot】

    之前在两篇文章中都有简单介绍或者提到过 自定义属性的用法: 25.Spring Boot使用自定义的properties[从零开始学Spring Boot] 51. spring boot属性文件之多 ...

  8. TabLayoutViewPagerDemo【TabLayout+ViewPager可滑动】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 使用TabLayout搭配ViewPager实现可滑动的顶部选项卡效果. 效果图 代码分析 1.演示常规的设置. 2.通过自定义Vi ...

  9. 基于springboot+bootstrap+mysql+redis搭建一套完整的权限架构【六】【引入bootstrap前端框架】

    https://blog.csdn.net/linzhefeng89/article/details/78752658 基于springboot+bootstrap+mysql+redis搭建一套完整 ...

  10. 【ecshop后台详解】系统设置-商店设置

    商店设置是我们ecshop新用户第一步先要设置的地方,因为里面相当于网站的基础.包括公司名称,电话,地址,tittle等重要的信息都是这里修改,如果这里没有修改的话,如果有访客来到你网站可能以为走错了 ...

随机推荐

  1. Jmeter安装与配置(第一篇)

    Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域. 它可以用于测试静态和动态资源,例如静态文 ...

  2. java连接SQLserver数据库模板代码

    package cn.mldn.lxh.dbc; import java.sql.Connection; import java.sql.DriverManager; public class Dat ...

  3. [TJOI2017]城市 【树的直径+暴力+优化】

    Online Judge:Luogu P3761 Label:树的直径,暴力 题目描述 从加里敦大学城市规划专业毕业的小明来到了一个地区城市规划局工作.这个地区一共有n座城市,n-1条高速公路,保证了 ...

  4. Windows API 第20篇 GetVolumeNameForVolumeMountPoint

    函数原型: BOOL GetVolumeNameForVolumeMountPoint(                                                        ...

  5. /etc/sysctl.conf配置文件

    # vi /etc/sysctl.conf # add by digoal.zhou fs.aio-max-nr = fs. kernel.core_pattern= /data01/corefile ...

  6. 阿里云数据库再获学术顶会认可,一文全览VLDB最新亮点

    一年一度的数据库领域顶级会议VLDB 2019于当地时间8月26日-8月30日在洛杉矶圆满落幕.在本届大会上,阿里云数据库产品团队浓墨登场,不仅有多篇论文入选Research Track和Indust ...

  7. error: stray ‘\357’ in program——输入了中文的标点符号

    /home/qian/Pioneer/src/network/src/WiFi_connect.cpp::: error: stray ‘\’ in program sockfd = socket(A ...

  8. 关于ie11的浏览器检测

    我的电脑昨天更新的时候把ie11给更新出来了,然后发现我的skylineweb项目提示我的浏览器不是ie,这样显然是浏览器检测出现了问题.查找后找到了下面的解决方法.大家的电脑如果也更新成了ie11的 ...

  9. 转载 ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(三) 激动人心的时刻到啦,实现1v1聊天

    ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(三) 激动人心的时刻到啦,实现1v1聊天   看起来挺简单,细节还是很多的,好,接上一篇,我们已经成功连接singalR服务器 ...

  10. PAT甲级——A1035 Password

    To prepare for PAT, the judge sometimes has to generate random passwords for the users. The problem ...