\(\\\)

\(Description\)


你现在有\(N\)个分布在二维平面上的整点\((x_i,y_i)\),现在需要你找到一个圆,满足:

  • 能够覆盖所有的给出点
  • 与\(x\)轴相切

现在需要你确定合法的圆的最小半径是多少,精度误差允许在\(10^{-6}\)范围内。

如果不存在一个合法的圆,输出\(-1​\)。

  • \(N\in [1,10^5],x_i,y_i\in [10^{-7},10^7]\)

\(\\\)

\(Solution\)


垃圾 \(Double\) 毁我青春

首先考虑哪些情况不合法。显然如果点全部在\(x\)轴同一侧显然有解,所以只需要判断所有\(y_i\)是否同号即可。

便于处理,我们将所有点都放到\(x\)轴上方。

然后注意到如果一个半径较小的圆合法,那么半径比他大的圆一定也存在一个合法的位置,于是我们在实数域上二分。设当前二分到的半径为\(K\),那么显然圆的纵坐标就是\(K\)了,设圆的横坐标为\(X\)。

那么对于一个点\(i\),该点在这个圆内当且仅当

\[(x_i-X)^2+(y_i-K)^2\le K^2
\]

稍作变形有

\[|x_i-X|\le \sqrt{K^2-(y_i-K)^2}
\]

即可得到对于该点来说,半径为\(K\)的圆合法的\(X\)对于范围:

\[\Delta=\sqrt{K^2-(y_i-K)^2}\ ,\ X\in[x_i-\Delta,x_i+\Delta]
\]

然而并不对。注意到\(\Delta\)可以进一步化简:

\[\Delta=\sqrt{K^2-(y_i-K)^2}=\sqrt{K^2-(y_i^2+K^2-2Ky_i)}=\sqrt{2Ky_i-y_i^2}
\]

看起来没什么不同?假的!下面我们就会谈到二分的范围,\(K^2\)是会爆掉 \(Double\) 的。

用了 \(Long\ Double\) 还是过不了?前面的式子精度会爆炸,精度丢失远高于后面的式子。

\(\\\)

然后二分边界就是对于所有点当前半径的合法区间的交集不为空。

这个部分可以维护最大的 \(L\) 和最小的 \(R\) ,直接判断 \(R>L\) 即可。

当时NC想什么差分数组区间标记前缀和,判断最大权是否为N

\(\\\)

然后讨论二分区间。极限数据两点分布于\((-10^7,1)\)和\((10^7,1)\),此时半径有\(5\times10^{13}\)之大!

所以二分上界设的大一点不虚\((10^{18}\)之类的\()\)。

\(\\\)

然后还有一个细节。注意\(\Delta\)计算的时候根号下的部分。

必须保证\(2Ky_i-y_i^2\ge 0\),也就是\(2K\ge y_i\),不加这一个特判,负数开根右转自闭......

\(\\\)

\(Code\)


#include<cmath>
#include<queue>
#include<cstdio>
#include<cctype>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define R register
#define gc getchar
#define N 100010
using namespace std; bool f=0; const double eps=1e-8; int n; struct point{double x,y;}p[N]; inline int rd(){
int x=0; bool f=0; char c=gc();
while(!isdigit(c)){if(c=='-')f=1;c=gc();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();}
return f?-x:x;
} inline bool valid(double x){
double l=-(double)1e18,r=(double)1e18,dlt;
for(R int i=1;i<=n;++i){
if(p[i].y>x+x) return 0;
dlt=sqrt(p[i].y*(2*x-p[i].y));
l=max(l,p[i].x-dlt); r=min(r,p[i].x+dlt);
}
return (r-l+eps>=0.0);
} int main(){
n=rd();
for(R int i=1;i<=n;++i){
p[i].x=(double)rd();
p[i].y=(double)rd();
if(p[i].y<0.0) f=1;
}
if(f==1) for(R int i=1;i<=n;++i){
p[i].y=-p[i].y;
if(p[i].y<0.0) {puts("-1");return 0;}
}
int t=0;
R double l=0.0,r=(double)1e18,mid;
while(t<=300){
mid=(l+r)/2.0; ++t;
valid(mid)?r=mid:l=mid;
}
printf("%.10lf",l);
return 0;
}

[ CodeForces 1059 D ] Nature Reserve的更多相关文章

  1. Codeforces Round #514 (Div. 2):D. Nature Reserve(二分+数学)

    D. Nature Reserve 题目链接:https://codeforces.com/contest/1059/problem/D 题意: 在二维坐标平面上给出n个数的点,现在要求一个圆,能够容 ...

  2. E - Nature Reserve CodeForces - 1059D

    传送门 There is a forest that we model as a plane and live nn rare animals. Animal number iihas its lai ...

  3. [CodeForces]1059D Nature Reserve

    大意:给你一个平面上N(N<=100000)个点,问相切于x轴的圆,将所有的点都覆盖的最小半径是多少. 计算几何???Div2的D题就考计算几何???某人昨天上课才和我们说这种计算几何题看见就溜 ...

  4. Nature Reserve

    Nature Reserve time limit per test:2 seconds memory limit per test:256 megabytes input:standard inpu ...

  5. Codeforces Round #514 (Div. 2) D. Nature Reserve

    http://codeforces.com/contest/1059/problem/D 最大值: 最左下方和最右下方分别有一个点 r^2 - (r-1)^2 = (10^7)^2 maxr<0 ...

  6. CF1059D Nature Reserve

    原题链接 网络不好的可以到洛谷上去QwQ 题目大意 有N个点,求与y=0相切的,包含这N个点的最小圆的半径 输入输出样例 输入: 2 0 1 1 1 输出 0.625 感觉最多是蓝题难度? 首先无解的 ...

  7. D - Nature Reserve(cf514,div2)

    题意:给出n(n<=1e5)个点,求一个最小的圆,与x轴相切,并且包含这n个点 思路:我第一想到的是,这个圆一定会经过一个点,再根据与x轴相切,我们可以找到最小的圆,让它包含其余的点,但是如何判 ...

  8. cf1059D. Nature Reserve(三分)

    题意 题目链接 Sol 欲哭无泪啊qwq....昨晚一定是智息了qwq 说一个和标算不一样做法吧.. 显然\(x\)轴是可以三分的,半径是可以二分的. 恭喜你获得了一个TLE的做法.. 然后第二维的二 ...

  9. CF1059D Nature Reserve(二分)

    简洁翻译: 有N个点,求与y=0相切的,包含这N个点的最小圆的半径 题解 二分半径右端点开小了结果交了二十几次都没A……mmp…… 考虑一下,显然这个半径是可以二分的 再考虑一下,如果所有点都在y轴同 ...

随机推荐

  1. python dos2unix

    有时你在windows上创建的文件拿到Linux/unix上运行会出错, 这是因为windows上有些字符如换行符在linux/unix不识别.这种情况下需要用dos2unix这个工具把文件转换成li ...

  2. laravel notification

    mail篇 public function via($notifiable) { return ['mail']; } 1.新建notification类 php artisan make:notif ...

  3. Linux改动/etc/profile配置错误command is not found自救方法

    我的CSDN博客地址: http://blog.csdn.net/caicongyang 博主之前在改动了/etc/profile配置文件方法后,导致bash命令无法用 运行ls命令结果例如以下: - ...

  4. 第二十七篇:Windows驱动中的PCI, DMA, ISR, DPC, ScatterGater, MapRegsiter, CommonBuffer, ConfigSpace

    近期有些人问我PCI设备驱动的问题, 和他们交流过后, 我建议他们先看一看<<The Windows NT Device Driver Book>>这本书, 个人感觉, 这本书 ...

  5. 关于MacBook怎么更新Android SDK

    昨天公司的人给了我一个VPN,可是还是无法更新SDK,后来发现将下图: 通过VPN发送全部流量勾选以后就能够连接更新了,哎.处处皆学问,特此分享一下此经验. 喜欢的朋友关注我哦! 多谢支持

  6. 跨域CORS原理及调用详细演示样例

      上篇博客介绍了JSONP原理,其不足,就是仅仅能使用GET提交.若传输的数据量大.这个JSONP方式就歇菜了.那这篇博客就来介绍还有一种跨域介绍方案-CORS.   相对JSONP,CORS支持P ...

  7. 大数据R语言简析

    R语言是用于统计分析.画图的语言和操作环境.R是属于GNU系统的一个自由.免费.源码开放的软件.它是一个用于统计计算和统计制图的优秀工具. R是统计领域广泛使用的诞生于1980年左右的S语言的一个分支 ...

  8. asp.net forms认证

    工作中遇到的asp.net项目使用forms认证.以前虽然用过,但其原理并不了解,现在甚至对什么是form认证也完全不知道了.对一样东西如果不清楚其原理,不知其所以然,那么死记硬背是无济于事的. as ...

  9. QQ空间说说 视频播放

    http://182.254.8.83/vwecam.gtimg.com/1006_d81d60f3c83844a5ad6a184149d4ccbb.f0.mp4?sha=78A27CF4908AB5 ...

  10. [noip模拟赛]bird

    https://www.zybuluo.com/ysner/note/1295414 题面 \(R\)是一个猎人,他准备打猎,他站在平面直角坐标系的\((0,0)\)位置. 天上有\(n\)只小鸟从右 ...