[CodeForces]1059D Nature Reserve
2024-09-01 04:15:28
大意:给你一个平面上N(N<=100000)个点,问相切于x轴的圆,将所有的点都覆盖的最小半径是多少。
计算几何???Div2的D题就考计算几何???某人昨天上课才和我们说这种计算几何题看见就溜。。。。
打完比赛才发现好像并不用计算几何,实则是一个二分答案的水题。。
发现如果点在x轴两侧就肯定不行,所以我们把所有的点都挪到一侧。
我们二分一个半径,然后发现因为圆相切于x轴,那么这个圆的圆心一定在y=r的直线上移动。
对于所有的点,它可以被如图的线段AC上的点覆盖,点在AC下方也同理。(终于有个图是我自己画的了。。。)
然后发现圆心的取值就在xi±√(R2-(R-yi)2)之间。
所以说把每个点的可取圆心的点的集合的交算出来,看看是不是空集,不是空集就可行。
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
using namespace std;
const double eps=1e-;
int n;
struct Node {int x,y;}node[];
bool flag;
bool ck(double mid) {
double l=-1e18,r=1e18;
for(int i=;i<=n;i++) {
if(node[i].y>mid+mid) return ;
double range=sqrt(node[i].y*(*mid-node[i].y));
l=max(l,node[i].x-range);r=min(r,node[i].x+range);
}
return (l-r+eps)<=;
}
int main() {
scanf("%d",&n);
scanf("%d%d",&node[].x,&node[].y);
if(node[].y<) flag=;node[].y=abs(node[].y);
for(int i=;i<=n;i++) {
scanf("%d%d",&node[i].x,&node[i].y);
if(flag&&node[i].y>){puts("-1") ;return ;}
if(flag==false && node[i].y<) {puts("-1");return ;}
node[i].y=abs(node[i].y);
}
double l=,r=1e18;int cnt=;
while(cnt--) {
double mid=(l+r)/;
if(ck(mid)) r=mid;
else l=mid;
}
printf("%lf",l);
}
Nature Reserve
最新文章
- Linux实时流量监控工具 - iftop
- 【转载】ubuntu和debian环境下无法挂载vmware虚拟机共享目录的解决办法
- Linux Shell Bash 带有特殊含义的退出码
- ♫【CSS】命名颜色
- Socket编程模式
- float的深入剖析
- 用C写一个web服务器(二) I/O多路复用之epoll
- php 启动过程 - reqeust RINIT 过程
- Oracle清除数据库中长时间占用资源的非活动的会话
- 10个html5增加的重要新特性和内容
- HDU 1051(处理木棍 贪心)
- 用户对动态PHP网页访问过程,以及nginx解析php步骤
- Python连接mysql出错,_mysql_exceptions.OperationalError: (1045, ";Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: YES)";)
- MyBio小隐本记注册破解
- Django框架的使用教程--类视图-中间间-模板[六]
- android怎么抓取双向认证https的包
- 【c++基础】static修饰的函数作用与意义
- Java虚拟机 - Class类文件结构
- 【Spark】SparkStreaming-Checkpoint-容错
- 多启动引导工具——AIO Boot