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\)轴相切 现在需要你确 ...
随机推荐
- 深入了解Object.defineProperty
原来写文章都是一次写两三个小时写完,偶尔看到一个人的博客了解到还有草稿箱这个功能,所以以后写文章的时候就舒服多了哈哈,可以存起来再发,不需要一口气写完了 最近一直在看JavaScript高级程序设计, ...
- ffmpeg相关函数整理
1.av_read_frame() 该函数用于读取具体的音/视频帧数据,从流中读取数据帧到 AVPacket,AVPacket保存仍然是未解码的数据 int av_read_frame(AVForma ...
- SQLServer之修改表值函数
修改表值函数注意事项 更改先前通过执行 CREATE FUNCTION 语句创建的现有 Transact-SQL 或 CLR 函数,但不更改权限,也不影响任何相关的函数.存储过程或触发器. 不能用 A ...
- 前后端分离djangorestframework—— 接入微信模板消息推送
微信 什么是微信也不多说,跟前面的支付宝一样的 微信支付 微信支付也有个沙箱环境,沙箱环境官方文档 由文档中那句很显眼的话所得,即使是测试环境也需要真实的商户号,所以这个就没法想支付宝那样用沙箱账号来 ...
- 南邮攻防训练平台逆向第四题WxyVM
下载文件elf文件,运行输入flag,用ida打开逆向算法: 不是很复杂,可以看出flag长度需要24,最终会和已给出dword_601060进行比较,一致则成功,那么现在只需要看上面的sub_400 ...
- Think_in_java_4th(并发学习一)
Java的并发是在顺序语言的基础上提供对线程的支持的. 并发能够更加有效的执行我们的代码,也就是更加合理的应用CPU资源. 并发程序往往CPU和内存使用率,要高于同等的非并发程序. 下面就用Think ...
- SAP CRM Installed Bases(IBase)简介
SAP CRM使用Installed Base(以下简称IBase)来组织服务相关对象并进行管理.因为我在最近的工作中经常接触这个概念,所以学习了一点相关文档.下面是文档的翻译. 本文链接:https ...
- 【模块04-大数据技术入门】02节-HDFS核心知识
分布式存储 (1) 5PB甚至更大的数据集怎么存储 ? 所有数据分块,每个数据块冗余存储在多台机器上(冗余可提高数据块高可用性).另外一台机器上启动一个管理所有节点.以及存储在各节点上面数据块的服务. ...
- centos7 搭建ntp时钟服务器
服务器 : 192.168.137.3 客户机: 192.168.137.6 1. 服务器端 centos7下首先确认服务器的防火墙.selinux关闭状态 # cat /etc/redhat-re ...
- ideal中把项目打成war包,并放在tomcat运行,遇见的问题。。。
先说下我遇见的问题吧:最近做项目要把项目放在tomcat上运行,用的springboot框架, 在建项目时选择的是 jar包,项目写完要部署打包是,在pom中虽然把包改成了war ,可是每次放入to ...