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\)轴相切 现在需要你确 ...
随机推荐
- 测者的性能测试手册:JVM的监控利器
测者的性能测试手册:JVM的监控利器 每次聊起性能测试,最后的终结话题就是怎么做优化.其实在Java的复杂项目中都会有内存不足问题.内存泄露问题.线程死锁问题.CPU问题.这些问题工程测试或者是小压力 ...
- The account that is running SQL Server Setup does not have one or all of the following rights: the right to back up files and directories, the right to manage auditing and the security log and the rig
安装SQL SERVER 是规则检查提示权限问题 运行secpol.msc,没有Debug program权限,添加即可,如果已加域则要在域策略修改,或退域安装后在加域.
- sqlbulkcopy 批量插入数据
批量插入 Datetable数据 通过sqlbulkcopy 插入1百万条数据 用时 10秒钟 (有兴趣的小伙伴可以去测试) /// <summary> /// /// </sum ...
- 连接到github
1,创建秘钥 $ ssh-keygen -t rsa -C "youremail@example.com"执行成功后,会在~/.ssh/目录下生成id_rsa和id_rsa.pub ...
- 龙尚 U9300C wvdial 拨号上网
龙尚 U9300C 7模 4G LTE (国内全网通) 接入linux系统会有4个串口 其中ttyUSB2 为AT指令口 ttyUSB1 为拨号上网口 wvdial 拨号入网参数 [ ...
- iOS Password AutoFill开发指南
转载请标明来源:https://www.cnblogs.com/zhanggui/p/9431950.html 引言 在<iPhone User Guide for iOS 11.4>这本 ...
- kernel笔记——块I/O
Linux下,I/O处理的层次可分为4层: 1. 系统调用层,应用程序使用系统调用指定读写哪个文件,文件偏移是多少 2. 文件系统层,写文件时将用户态中的buffer拷贝到内核态下,并由cache缓 ...
- 详解Linux双网卡绑定之bond0
1.什么是bond? 网卡bond是通过多张网卡绑定为一个逻辑网卡,实现本地网卡的冗余,带宽扩容和负载均衡,在生产场景中是一种常用的技术.Kernels 2.4.12及以后的版本均供bonding模块 ...
- js 对数据进行过滤
//对数据进行过滤 Array.prototype.filter = Array.prototype.filter || function (func) { var arr = this; var r ...
- 微信小程序遍历Echarts图表,实现多个饼图
如何在微信小程序中使用Echarts可以看我的另一个教程:点击查看 首先看一个简单的例子 1.wxml文件 <view style='width:100%;height:200rpx'> ...