【题目链接】

  • 点击打开链接

【思路要点】

  • 考虑找到使得 ∣ P X − Q X ∣ |PX-QX| ∣PX−QX∣ 最小的 X X X , X X X 应为 P P P 关于 l l l 的对称点 P ′ P' P′ 与 Q Q Q 所连直线与 l l l 的交点,若两直线平行,则 X X X 可取无穷远处的一点。
  • 此时 ∣ P X − Q X ∣ = P ′ Q |PX-QX|=P'Q ∣PX−QX∣=P′Q ,因此原问题即为任取一条直线,找到 P P P 的对称点距离 Q Q Q 的最短距离。
  • 考虑二分答案 m i d mid mid ,我们需要判断是否存在一条直线使得 P P P 的对称点在 Q Q Q 为圆心, m i d mid mid 为半径的圆内,不妨设为圆 Q Q Q 。
  • 注意到 P P P 关于直线 A B AB AB 的对称点 P ′ P' P′ 同时也可以看做 A A A 为圆心, A P AP AP 为半径的圆和 B B B 为圆心, B P BP BP 为半径的圆的另一个交点。
  • 由此,我们可以将 A A A 和 B B B 分开考虑。
  • 记圆 Q Q Q 在 A A A 为圆心, A P AP AP 为半径的圆内的圆周为 A r c A Arc_A ArcA​ , P P P 关于直线 A B AB AB 的对称点 P ′ P' P′ 在圆 Q Q Q 内当且仅当 A r c A , A r c B Arc_A,Arc_B ArcA​,ArcB​ 均非空,且不存在包含关系。
  • 由此,我们只需要判断一些环上的区间是否存在相交关系即可,可以排序后用栈来判断。
  • 时间复杂度 O ( N L o g N L o g V ) O(NLogNLogV) O(NLogNLogV) 。

【代码】

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 5;
const double eps = 1e-10;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
template <typename T> void chkmax(T &x, T y) {x = max(x, y); }
template <typename T> void chkmin(T &x, T y) {x = min(x, y); }
template <typename T> void read(T &x) {x = 0; int f = 1;char c = getchar();for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';x *= f;
}
template <typename T> void write(T x) {if (x < 0) x = -x, putchar('-');if (x > 9) write(x / 10);putchar(x % 10 + '0');
}
template <typename T> void writeln(T x) {write(x);puts("");
}
struct point {double x, y; };
struct circle {point o; double r; };
point operator + (point a, point b) {return (point) {a.x + b.x, a.y + b.y}; }
point operator - (point a, point b) {return (point) {a.x - b.x, a.y - b.y}; }
point operator * (point a, double b) {return (point) {a.x * b, a.y * b}; }
double operator * (point a, point b) {return a.x * b.y - a.y * b.x; }
double moo(point a) {return sqrt(a.x * a.x + a.y * a.y); }
point unit(point a) {return a * (1.0 / moo(a)); }
double dist(point a, point b) {return moo(b - a); }
double PolarAngle(point a) {return atan2(a.y, a.x); }
pair <point, point> intersect(circle a, circle b) {double d = dist(a.o, b.o);double x = (a.r * a.r + d * d - b.r * b.r) / (2 * d);double z = sqrt(a.r * a.r - x * x);point u = unit(b.o - a.o);point mid = a.o + u * x;swap(u.x, u.y), u.x *= -1;return make_pair(mid + u * z, mid - u * z);
}
int n; double l;
circle a[MAXN];
point p, q;
bool valid(double mid) {circle o = (circle) {p, mid};vector <pair <double, int>> res;int tot = 0;for (int i = 1; i <= n; i++) {double d = dist(o.o, a[i].o);if (o.r + a[i].r > d && fabs(o.r - a[i].r) < d) {tot++;pair <point, point> tmp = intersect(o, a[i]);res.emplace_back(PolarAngle(tmp.first - o.o), tot);res.emplace_back(PolarAngle(tmp.second - o.o), tot);}}if (res.empty()) return false;sort(res.begin(), res.end());static int Stack[MAXN]; int top = 0;for (auto x : res) {if (Stack[top] == x.second) top--;else Stack[++top] = x.second;}return top != 0;
}
int main() {read(n), read(l);p = (point) {l, 0}, q = (point) {-l, 0};for (int i = 1; i <= n; i++) {read(a[i].o.x), read(a[i].o.y);a[i].r = dist(a[i].o, q);}double l = 0, r = dist(p, q);while (r - l >= eps) {double mid = (l + r) / 2;if (valid(mid)) r = mid;else l = mid;}printf("%.8lf\n", (l + r) / 2);return 0;
}

【CodeForces645G】Armistice Area Apportionment相关推荐

  1. UE4蓝图节点文档翻译【目录】--- Expandable Area

    翻译人:灵月散人 参考的引擎版本:4.18.1 敬告:翻译内容仅作参考,目的是为了临时降低无基础者初期的学习门槛.当书写.交流.等实际使用时必须以英文为准 官网地址 Expandable Area 翻 ...

  2. 【LeetCode】深搜DFS(共85题)

    [98]Validate Binary Search Tree [99]Recover Binary Search Tree [100]Same Tree [101]Symmetric Tree [1 ...

  3. 【工具】部分浏览器截图操作--Edge+Chrome+360浏览器

    [工具]部分浏览器截图操作–Edge+Chrome+360浏览器 一.Google浏览器截图 1,进入Google浏览器开发者模式 在网页空白处右击鼠标,选择"检查(N)",打开控 ...

  4. OSPF协议将其管理的网络划分为不同类型的若干区域(Area),其中标准区域特点是(64);存根区域(stub)的特点是(65)。【答案】C B

    OSPF协议将其管理的网络划分为不同类型的若干区域(Area),其中标准区域特点是(64):存根区域(stub)的特点是(65). (64)A.不接受本地AS之外的路由信息,也不接受其他区域的路由汇总 ...

  5. 【cornerstone】多边形标注组件(FreehandRoi)的Area悬浮文本项的消除

    [cornerstone]多边形标注组件(FreehandRoi)的Area悬浮文本项的消除 Method1: github issue Method2

  6. 【leetcode】963. Minimum Area Rectangle II

    题目如下: Given a set of points in the xy-plane, determine the minimum area of any rectangle formed from ...

  7. 【opencv】(6) 图像轮廓处理

    各位同学好,今天和大家分享一下opencv中如何获取图像轮廓,以及对轮廓的一些其他操作.内容有: (1)轮廓检测:cv2.findContours():(2)轮廓绘制:cv2.drawContours ...

  8. 是男人就下100层【第四层】——Crazy贪吃蛇(2)

    在上一篇<是男人就下100层[第四层]--Crazy贪吃蛇(1)>中我们让贪吃蛇移动了起来,接下来我们来实现让贪吃蛇能够绕着手机屏幕边线移动而且能够改变方向 一.加入状态并改动代码 首先我 ...

  9. java切面类整合_SpringBoot2.x【五】整合AOP切面编程

    SpringBoot2.x[五]整合AOP切面编程 面向方面编程(AOP)通过提供另一种思考程序结构的方式来补充面向对象编程(OOP). OOP中模块化的关键单元是类,而在AOP中,模块化单元是方面. ...

最新文章

  1. Can't pickle local object 'CDLL.__init__.locals._FuncPtr'
  2. Bete冲刺第五阶段
  3. 关于spring boot集成MQTT的一写新人问题
  4. printwriter 要close吗_中国股市:市盈率低估,就意味着可以买入吗?不懂你就输了...
  5. linux tcp 断线检测,CentOS下TCP断线监测
  6. Binding在WPF中的使用
  7. Java中Comparator和Comparable之间的区别
  8. php读取云平台数据库,读取Read · ThinkPHP5+数据库和模型 · 看云
  9. java 关联表做修改_java-图关联列表实现
  10. python如何使数据加行_如何使用 Python 插入行
  11. 推荐一份Web 工程师的前端书单
  12. 普通人适合哪种O2O创业模式 O2O模式的应用价值是什么?
  13. 一文了解滴滴与蚂蚁金服开源共建的SQLFlow
  14. 我对“结构化思维”的理解 - 直播分享
  15. opencv将预测的68个landmarks标注到图片上
  16. windows .exe 文件默认打开方式变成记事本的解决方法
  17. HP-OMEN-暗夜精灵8,安装WIN10
  18. 易得无价宝,难得有情郎
  19. 【MySQL8入门到精通】运维篇-SQL实战(100道题库)
  20. 戴尔 Vostro 3470 成就商务台式机(i3-8100) 安装Win7系统

热门文章

  1. 蓝桥杯 印章Java
  2. axure 动态面板 自动适应浏览器宽度_动态面板之“固定到浏览器”与“自适应窗口宽度”特性解读图文教程(18)...
  3. day31-20180720-流利阅读笔记
  4. 开发一款游戏需要服务器系统,搭建一个游戏服务器需要什么
  5. echarts在中国地图上绘制各省指标
  6. 勾股定理 —— 证明大全
  7. 区块链中的女巫攻击问题
  8. plt.xticks()
  9. Qt软件下载地址(开源,免费下载,解决方案)
  10. Python爬取《你好李焕英》猫眼实时票房