CF1059D Nature Reserve
题目大意
有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的更多相关文章
- cf1059D. Nature Reserve(三分)
题意 题目链接 Sol 欲哭无泪啊qwq....昨晚一定是智息了qwq 说一个和标算不一样做法吧.. 显然\(x\)轴是可以三分的,半径是可以二分的. 恭喜你获得了一个TLE的做法.. 然后第二维的二 ...
- CF1059D Nature Reserve(二分)
简洁翻译: 有N个点,求与y=0相切的,包含这N个点的最小圆的半径 题解 二分半径右端点开小了结果交了二十几次都没A……mmp…… 考虑一下,显然这个半径是可以二分的 再考虑一下,如果所有点都在y轴同 ...
- Codeforces Round #514 (Div. 2):D. Nature Reserve(二分+数学)
D. Nature Reserve 题目链接:https://codeforces.com/contest/1059/problem/D 题意: 在二维坐标平面上给出n个数的点,现在要求一个圆,能够容 ...
- 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 ...
- Nature Reserve
Nature Reserve time limit per test:2 seconds memory limit per test:256 megabytes input:standard inpu ...
- [CodeForces]1059D Nature Reserve
大意:给你一个平面上N(N<=100000)个点,问相切于x轴的圆,将所有的点都覆盖的最小半径是多少. 计算几何???Div2的D题就考计算几何???某人昨天上课才和我们说这种计算几何题看见就溜 ...
- D - Nature Reserve(cf514,div2)
题意:给出n(n<=1e5)个点,求一个最小的圆,与x轴相切,并且包含这n个点 思路:我第一想到的是,这个圆一定会经过一个点,再根据与x轴相切,我们可以找到最小的圆,让它包含其余的点,但是如何判 ...
- 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 ...
- [ CodeForces 1059 D ] Nature Reserve
\(\\\) \(Description\) 你现在有\(N\)个分布在二维平面上的整点\((x_i,y_i)\),现在需要你找到一个圆,满足: 能够覆盖所有的给出点 与\(x\)轴相切 现在需要你确 ...
随机推荐
- ORACLE如何检查找出损坏索引(Corrupt Indexes)
在Oracle数据库中如何找出损坏索引呢? 下面我们人为构造一个案例,将索引块损坏.如下案例所示: SQL> create tablespace test_data 2 datafil ...
- Python 日志模块logging
logging模块: logging是一个日志记录模块,可以记录我们日常的操作. logging日志文件写入默认是gbk编码格式的,所以在查看时需要使用gbk的解码方式打开. logging日志等级: ...
- 《Effective Java中文版第二版》读书笔记
说明 这里是阅读<Effective Java中文版第二版>的读书笔记,这里会记录一些个人感觉稍微有些重要的内容,方便以后查阅,可能会因为个人实力原因导致理解有误,若有发现欢迎指出.一些个 ...
- 【Python 21】52周存钱挑战1.0
1.案例描述 按照52周存钱法,存钱人必须在一年52周内,每周递存10元.例如,第一周存10元,第二周存20元,第三周存30元,直到第52周存520元. 记录52周后能存多少钱?即10+20+30+. ...
- 3.15 总结,初始java
- P4554 小明的游戏
SPFA板子题 #include <stdio.h> #include <string.h> #define Clean(X,K) memset(X,K,sizeof(X)) ...
- Google Chrome等浏览器不允许关闭点击跟踪??
hrome.Safari.Opera 和 Microsoft Edge 的新版本将不再允许用户关闭“链接审计( hyperlink auditing)”的功能.链接审计是一项 HTML 标准,被用于跟 ...
- Java高级篇(四)——反射
之前写到了设计模式的代理模式,因为下一篇动态代理等内容需要用到反射的知识,所以在之前Java篇的基础上再写一篇有关反射的内容,还是以实际的程序为主,了解反射是做什么的.应该怎么用. 一.什么是反射 反 ...
- 3-STM32带你入坑系列(自己封装点亮一个灯的库--Keil)
2-STM32带你入坑系列(点亮一个灯--Keil) 首先建一个stm32f103x.h的文件,然后 #include "stm32f103x.h" 还记得上一节 现在呢就是做一个 ...
- IS创新之路 -- 都昌公司赋能型HIT企业发展之路
◆◆前言 近日,上海瑞金医院对我司表示:“我院从2000年开始自主开发医院信息系统,走出了一条可持续的信息化发展之路.已建成五大系统,284个子系统.但我院仍然坚持在努力推进以电子病历为核心医院信息化 ...