原题链接

网络不好的可以到洛谷上去QwQ

题目大意

有N个点,求与y=0相切的,包含这N个点的最小圆的半径

输入输出样例

输入:

2

0 1

1 1

输出

0.625

感觉最多是蓝题难度?

首先无解的情况很简单,如果存在一个点使得它与其他点相对于\(x\)轴不同侧,就无解(显然)。考虑到半径不好直接确定,我们二分一下。然后就是怎么\(check\)的问题了。为了方便,我们假设所有的点都在\(x\)轴上方。

假设此时二分的值为\(mid\),左右端点分别为\(l,r\),那么圆心一定在\(y=mid\)这条直线上。对于某个确定的点,因为它能被覆盖,且半径和圆心的纵坐标已知,所以可以确定圆心横坐标的取值区间(如果它到\(y=mid\)的距离超过\(mid\)的话就可以直接让\(check\)返回\(0\)了)。所以我们考虑取所有点对应的取值区间的交集,如果交集非空,就让\(check\)返回\(1\),缩小\(r\)的范围,否则增大\(l\)的范围。这样就可以了。

虽然题目要求的误差范围是\(10^{-6}\),但不知道为什么这样写会T:

while((r-l) > 1e-6) {
mid = (l+r)/2.0;
if(check(mid)) r = mid;
else l = mid;
}

于是我就改成了这样:

int t = 0;
while(t++ <= 210) {
mid = (l+r)/2.0;
if(check(mid)) r = mid;
else l = mid;
}

就A了。其中的原因,我无法明白,望诸君指教。

AC代码:

#include <bits/stdc++.h>

using namespace std;

const long double EPS = 0.00000001;
const int N = 100000; int n; struct Node {
long long x, y;
}nodes[N+5]; template <typename T>
T Abs(T x) { return x >= 0 ? x : -x; }
template <typename T>
T Max(T x, T y) { return x > y ? x : y; }
template <typename T>
T Min(T x, T y) { return x > y ? y : x; } double disX(int y, double r) {
return sqrtl(-1.0*y*y+2.0*r*Abs(y));
} int check(double x) {
if(Abs(nodes[1].y)-x > x) return 0;
if(x-Abs(nodes[1].y) < -x) return 1;
double l1, r1, l = nodes[1].x-disX(nodes[1].y, x), r = nodes[1].x+disX(nodes[1].y, x);
for(int i = 2; i <= n; ++i) {
if(Abs(nodes[i].y)-x > x) return 0;
if(x-Abs(nodes[i].y) > x) return 1;
l1 = nodes[i].x-disX(nodes[i].y, x), r1 = nodes[i].x+disX(nodes[i].y, x);
l = Max(l1, l), r = Min(r1, r);
}
return l <= r;
} int main() {
scanf("%d", &n);
int dir = 0;
for(int i = 1; i <= n; ++i) {
scanf("%I64d%I64d", &nodes[i].x, &nodes[i].y);
if(!dir && nodes[i].y != 0) dir = (nodes[i].y > 0 ? 1 : -1);
if(nodes[i].y != 0)
if((dir == 1 && nodes[i].y < 0) || (dir == -1 && nodes[i].y > 0)) {
printf("-1\n");
return 0;
}
}
double l = 0, r = 1e17, mid = r;
int t = 0;
while(t++ <= 210) {
mid = (l+r)/2.0;
if(check(mid)) r = mid;
else l = mid;
}
printf("%.8lf\n", mid);
return 0;
}

给一组数据:

输入:

4

-10000000 1

10000000 1

-10000000 10000000

10000000 10000000

输出:

50000000000000.4921875

CF1059D Nature Reserve的更多相关文章

  1. cf1059D. Nature Reserve(三分)

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

  2. CF1059D Nature Reserve(二分)

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

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

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

  4. 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 ...

  5. Nature Reserve

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

  6. [CodeForces]1059D Nature Reserve

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

  7. D - Nature Reserve(cf514,div2)

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

  8. 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 ...

  9. [ CodeForces 1059 D ] Nature Reserve

    \(\\\) \(Description\) 你现在有\(N\)个分布在二维平面上的整点\((x_i,y_i)\),现在需要你找到一个圆,满足: 能够覆盖所有的给出点 与\(x\)轴相切 现在需要你确 ...

随机推荐

  1. python爬虫实战:利用scrapy,短短50行代码下载整站短视频

    近日,有朋友向我求助一件小事儿,他在一个短视频app上看到一个好玩儿的段子,想下载下来,可死活找不到下载的方法.这忙我得帮,少不得就抓包分析了一下这个app,找到了视频的下载链接,帮他解决了这个小问题 ...

  2. 在Windows 10上利用seafile搭建个人云服务

    参考seafile官方文档 安装Python 2.7.11 32位版 下载地址:https://www.python.org/downloads/release/python-2711/ 选择 32位 ...

  3. netcat的简单使用(一)

    简单写一下netcat这个强悍的工具,主要是怕自己忘了 功能大致这些个,有遗漏的欢迎私信补充 1.侦听模式/传输模式 2.telnet/获取banner信息 3.传输文本信息 4.传输文件/目录 5. ...

  4. Web应用安全测试

    偷偷挪用人家的分享: https://blog.csdn.net/aojie80/article/details/43836521 写的很棒 Burp Suite 介绍 https://blog.cs ...

  5. Linux垃圾清理

    一.删除缓存 1,非常有用的清理命令:sudo apt-get autoclean                清理旧版本的软件缓存sudo apt-get clean                ...

  6. 4.13Python数据处理篇之Matplotlib系列(十三)---轴的设置

    目录 目录 前言 (一)设置轴的范围 1.同时对于x,y轴设置 2.分别对与x,y轴的设置 (二)设置刻度的大小 1.普通的刻度设置 2.添加文本的刻度设置 3.主副刻度的设置 (三)设置轴的数据 1 ...

  7. 我的第一个python web开发框架(24)——系统重构与ORM

    小白弄完代码版本管理和接口文档后,兴奋的找到老菜. 小白:老大,我已经按你讲的要求,将代码版本管理和接口文档都搞好了.从项目开始到现在,除了代码编写,感觉学会好多东西啊. 老菜:嗯嗯,实战确实需要掌握 ...

  8. Windows Service 学习系列(一):建立简单的Windows service

    参考:https://www.cnblogs.com/cncc/p/7170951.html 一.开发环境 操作系统:Windows 7 X64 开发环境:VS2017 编程语言:C# .NET版本: ...

  9. hbase 迁库移库步骤

    1 将数据导出 hbase org.apache.hadoop.hbase.mapreduce.Export t_zyzx_grzyfwtjxxb /hbase/data_backup/2018103 ...

  10. Ubuntu16.04中php如何切换版本

    其实就是一条Linux命令,如下: sudo update-alternatives --config php 会出现下面选项: There are choices for the alternati ...