题解

二分一个横坐标,过这个横坐标做一条和y轴平行的直线,相当于在这条直线上做区间覆盖,如果区间有交的话,那么答案是True
否则的话取两个不相交的区间,如果这两个圆相离或相切则不合法

否则看看相交的部分在二分的横坐标的左边还是右边,进行更新

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define pdi pair<db,int>
#define mp make_pair
#define pb push_back
#define enter putchar('\n')
#define space putchar(' ')
#define eps 1e-8
#define mo 974711
#define MAXN 100005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {res = 0;char c = getchar();T f = 1;while(c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();}while(c >= '0' && c <= '9') {res = res * 10 + c - '0';c = getchar();}res *= f;
}
template<class T>
void out(T x) {if(x < 0) {x = -x;putchar('-');}if(x >= 10) {out(x / 10);}putchar('0' + x % 10);
}int N,tot;
bool dcmp(db a,db b) {return fabs(a - b) < eps;
}
struct Point {db x,y;Point(db _x = 0.0,db _y = 0.0) {x = _x;y = _y;}friend Point operator + (const Point &a,const Point &b) {return Point(a.x + b.x,a.y + b.y);}friend Point operator - (const Point &a,const Point &b) {return Point(a.x - b.x,a.y - b.y);}friend db operator * (const Point &a,const Point &b) {return a.x * b.y - a.y * b.x;}friend Point operator * (const Point &a,const db &d) {return Point(a.x * d,a.y * d);}friend Point operator / (const Point &a,const db &d) {return Point(a.x / d,a.y / d);}friend db dot(const Point &a,const Point &b) {return a.x * b.x + a.y * b.y;}db norm() {return x * x + y * y;}};
struct Circle {Point O;db R;
}C[MAXN];
struct line {db s,t;int id;friend bool operator < (const line &a,const line &b) {return a.t < b.t || (a.t == b.t && a.s < b.s);}
}L[MAXN];
db dis(Point a,Point b) {return sqrt((b - a).norm());
}
int check(db mid) {tot = 0;for(int i = 1 ; i <= N ; ++i) {if(fabs(mid - C[i].O.x) >= C[i].R) {if(mid > C[i].O.x) return -1;else return 1;}db t = sqrt(C[i].R * C[i].R - (C[i].O.x - mid) * (C[i].O.x - mid));L[++tot] = (line){C[i].O.y - t,C[i].O.y + t,i};}sort(L + 1,L + tot + 1);db a = L[1].s,b = L[1].t;for(int i = 2 ; i <= N ; ++i) {a = max(a,L[i].s);b = min(b,L[i].t);}if(a + eps < b) return 0;for(int i = 2 ; i <= N ; ++i) {if(L[i].s >= L[1].t) {int u = L[1].id,v = L[i].id;if(dis(C[u].O,C[v].O) >= C[u].R + C[v].R) return -2;else {Point p = C[u].O + (C[v].O - C[u].O) * (C[u].R / dis(C[v].O,C[u].O));if(p.x < mid) return -1;else return 1;}} }
}
void Solve() {read(N);for(int i = 1 ; i <= N ; ++i) {scanf("%lf%lf%lf",&C[i].O.x,&C[i].O.y,&C[i].R);}db L = C[1].O.x - C[1].R,R = C[1].O.x + C[1].R;for(int i = 2 ; i <= N ; ++i) {L = min(L,C[i].O.x - C[i].R);R = max(R,C[i].O.x + C[i].R);}int cnt = 50;while(cnt--) {db mid = (L + R) / 2;int x = check(mid);if(x == -2) {puts("NO");return;}if(x == 0) {puts("YES");return;}if(x == -1) {R = mid;}else {L = mid;}}if(check(L) != 0) puts("NO");else puts("YES");
}
int main() {
#ifdef ivorysifreopen("f1.in","r",stdin);
#endifSolve();return 0;
}

转载于:https://www.cnblogs.com/ivorysi/p/10095868.html

【BZOJ】2289: 【POJ Challenge】圆,圆,圆相关推荐

  1. BZOJ 2287 POJ Challenge 消失之物

    BZOJ题目不完整,看了看题解.发现他们都要取模10,还以为是dp的限制. 改了两小时,之后猛然发现.卧槽原本我少了一个取模. 写法1:暴力写法 最简单的想法(只要你会背包dp) 我在枚举每次不选哪个 ...

  2. C++继承——以应用抽象类,求圆、圆内接正方形、圆外切正方形的面积和周长为例

    c++中基类的继承及其使用,以圆的内接正方形和外切正方形为例 1:C++中继承的方式 C++中的继承主要分为三类:public公有继承.protected保护继承以及private私有继承,其使用范围 ...

  3. 圆与圆的位置关系题目含答案_圆与圆的位置关系课时练习题(附答案)

    由莲山课件提供http://www.5ykj.com/ 资源全部免费温馨提示: 此套题为Word版,请按住Ctrl,滑动鼠标滚轴,调节合适的观看比例,答案解析附后.关闭Word文档返回原板块.课时提 ...

  4. 圆与圆的位置关系题目含答案_中考总复习:圆的专题复习-圆的性质及与圆有关的位置关系考点分析...

    大家好,欢迎进入Math实验室- 专注于数学的我是用心的! 考点:垂径定理 知识点分析: 1.垂径定理:垂直于弦的直径平分这条弦,并且平分弦所对的两条弧. 2.结论: ①平分弦(不是直径)的直径垂直于 ...

  5. 高中数学必修2:平面解析几何之直线与圆、圆与圆的位置关系

    今天分享关于高中数学必修2平面解析几何中的直线与圆.圆与圆的位置关系 知识点,分别从三个方面讲解,用5个经典习题进行解答全过程. 1.直线与圆的位置关系 2.圆与圆的位置关系 2.求圆的弦长的常用方法 ...

  6. 计算几何中的圆与圆相切和圆与直线相切

    定义常用点,圆,向量的运算: const double eps = 1e-9; const double PI = acos(-1.0); const int MAXN = 60;struct Poi ...

  7. 计算几何之圆与圆的交点

    计算圆与圆的交点,需要用到余弦定理 步骤如下: 求出两个圆的圆心距d 求出向量c2.c-c1.c与c1.c到某交点的向量夹角a 求出向量c2.c-c1.c与x轴的夹角t 那么,两个交点就分别是以c1. ...

  8. 使用html制作圆弧正方形,JavaScript+html5 canvas制作的圆中圆效果实例

    本文实例讲述了JavaScript+html5 canvas制作的圆中圆效果.分享给大家供大家参考,具体如下: 运行效果截图如下: 具体代码如下: demo #canvas { background: ...

  9. BZOJ 2287 【POJ Challenge】消失之物

    2287: [POJ Challenge]消失之物 Description ftiasch 有 N 个物品, 体积分别是 W1, W2, ..., WN. 由于她的疏忽, 第 i 个物品丢失了. &q ...

  10. bzoj2287【POJ Challenge】消失之物 缺一01背包

    bzoj2287[POJ Challenge]消失之物 缺一01背包 链接 bzoj 思路 分治solve(l,r,arr)表示缺少物品\([l,r]\)的dp数组arr. 然后solve(l,mid ...

最新文章

  1. 笨办法学python3_笨办法学python3—练习38
  2. Zxing二维码的集成使用
  3. Python高阶函数--map、lambda、reduce、filter、zip
  4. C#中的平台调用(P/Invoke)
  5. alert时java还时js_js 加alert后才能执行方法
  6. 10-对象实例化、内存布局与访问定位
  7. java udp ip端口 设置_UDP端口扫描Java只找到1个开放的UDP端口
  8. MyBatis系列-Mybatis入门精讲
  9. linux scp命令_太麻烦!使用 Linux scp 命令下载文件到 Windows 桌面
  10. 最短路径之迪杰斯特拉算法
  11. mysql觸發器_mysql觸發器案例
  12. dnf 卸载软件linux,Linux软件安装与卸载的基本概念
  13. wps vba6.3 宏插件下载
  14. redhat linux u盘安装教程,U盘安装Linux系统【RHEL 6.3 Server】
  15. 高通WLAN框架学习(27)-- Types of regulatory 和WCNSS_qcom_cfg.ini配置参数
  16. docker 命令补全
  17. Cisco IPCC概述
  18. OSPF邻居状态详解
  19. python 读取excel中单元格的内容
  20. oc照片库图片的选择处理

热门文章

  1. plsql变量参数化_谁说建模一定要会画图?参数化设计让你事半功倍!
  2. java多线程生产者与消费者案例_多线程操作实例——生产者与消费者
  3. ctfshow-萌新-web9( 利用命令执行漏洞读取网站敏感文件)
  4. Webpack4.0 升级配置
  5. Mysql 索引(学习笔记十二)
  6. 一些常用的场景进行描述分析(权限管理、6个典型场景)
  7. inputType属性
  8. EAI企业应用集成场景及解决方案
  9. asp.net mvc 依赖缓存启动项配置
  10. 横向的二级导航菜单,在多浏览器下可用