题意

给\(n\)个点,求一个能覆盖所有点的面积最小的圆。(\(n \le 50000\))

分析

随机增量法

题解

理论上\(O(n^3)\)暴力,实际上加上随机化后期望是\(O(n)\)的。

算法大概就是:

假设我们已经得到了最小覆盖圆\(O\),然后现在考虑假如第\(i\)个点进去。

如果第\(i\)个点在圆内或在圆上,则不需要更改。如果在圆外,显然最小覆盖圆要经过这个点。

于是又从头考虑\(1 \sim i-1\)这些点,我们只需要找到一个经过\(i\)点的覆盖所有点的最小覆盖圆。于是同前面一步一直类推下去。

直到出现了最小覆盖圆要经过三个点。于是三点确定一个圆就行了。

#include <bits/stdc++.h>
using namespace std;
typedef double lf;
const int N=1000005;
const lf eps=1e-8;
int n;
struct ip {
lf x, y;
ip(lf _x=0, lf _y=0) : x(_x), y(_y) { }
void scan() {
scanf("%lf%lf", &x, &y);
}
}a[N];
inline lf sqr(lf a) {
return a*a;
}
inline lf dist(ip &a, ip &b) {
return sqr(a.x-b.x)+sqr(a.y-b.y);
}
inline ip getO(ip &a, ip &b, ip &c) {
lf x1=b.x-a.x, y1=b.y-a.y, z1=(sqr(x1)+sqr(y1))/2,
x2=c.x-a.x, y2=c.y-a.y, z2=(sqr(x2)+sqr(y2))/2,
s=x1*y2-x2*y1;
if(s>-eps && s<eps) {
if(x1*x2<-eps) {
return ip((b.x+c.x)/2, (b.y+c.y)/2);
}
return ip((a.x+c.x)/2, (a.y+c.y)/2);
}
return ip(a.x+(z1*y2-z2*y1)/s, a.y+(x1*z2-x2*z1)/s);
}
inline int rand() {
typedef long long ll;
static ll mo=1e9+7, g=78125, now=2333;
return (now*=g)%=mo;
}
int main() {
scanf("%d", &n);
for(int i=0; i<n; ++i) {
a[i].scan();
if(i) {
swap(a[i], a[rand()%i]);
}
}
ip o=a[0];
lf r=0;
for(int i=1; i<n; ++i) {
if(dist(a[i], o)-r>eps) {
o=a[i];
r=0;
for(int j=0; j<i; ++j) {
if(dist(a[j], o)-r>eps) {
o=ip((a[i].x+a[j].x)/2, (a[i].y+a[j].y)/2);
r=dist(a[i], o);
for(int k=0; k<j; ++k) {
if(dist(a[k], o)-r>eps) {
o=getO(a[i], a[j], a[k]);
r=dist(a[k], o);
}
}
}
}
}
}
printf("%.2f %.2f %.2f\n", o.x, o.y, sqrt(r));
return 0;
}

【BZOJ】2823: [AHOI2012]信号塔的更多相关文章

  1. 2018.07.04 BZOJ 2823: AHOI2012信号塔(最小圆覆盖)

    2823: [AHOI2012]信号塔 Time Limit: 10 Sec Memory Limit: 128 MB Description 在野外训练中,为了确保每位参加集训的成员安全,实时的掌握 ...

  2. BZOJ 2823: [AHOI2012]信号塔

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2823 随机增量法.不断加点维护圆,主要是三点共圆那里打得烦(其实也就是个两中垂线求交点+联立方 ...

  3. BZOJ.2823.[AHOI2012]信号塔(最小圆覆盖 随机增量法)

    BZOJ 洛谷 一个经典的随机增量法,具体可以看这里,只记一下大体流程. 一个定理:如果一个点\(p\)不在点集\(S\)的最小覆盖圆内,那么它一定在\(S\bigcup p\)的最小覆盖圆上. 所以 ...

  4. bzoj 2823: [AHOI2012]信号塔 最小圆覆盖

    题目大意: 给定n个点,求面积最小的园覆盖所有点.其中\(n \leq 10^6\) 题解: 恩... 刚拿到这道题的时候... 什么???最小圆覆盖不是\(O(n^3)\)的随机增量算法吗????? ...

  5. bzoj2823[AHOI2012]信号塔

    2823: [AHOI2012]信号塔 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1190  Solved: 545[Submit][Status ...

  6. 【BZOJ2823】[AHOI2012]信号塔(最小圆覆盖)

    [BZOJ2823][AHOI2012]信号塔(最小圆覆盖) 题面 BZOJ 洛谷 相同的题: BZOJ1 BZOJ2 洛谷 题解 模板题... #include<iostream> #i ...

  7. 【bzoj2823】 AHOI2012—信号塔

    http://www.lydsy.com/JudgeOnline/problem.php?id=2823 (题目链接) 题意 求最小圆覆盖 Solution 关于最小圆覆盖的做法,论文里面都有.其实真 ...

  8. (bzoj1337 || 洛谷P1742 最小圆覆盖 )|| (bzoj2823 || 洛谷P2533 [AHOI2012]信号塔)

    bzoj1337 洛谷P1742 用随机增量法.讲解:https://blog.csdn.net/jokerwyt/article/details/79221345 设点集A的最小覆盖圆为g(A) 可 ...

  9. AHOI2012 信号塔 | 最小圆覆盖模板

    题目链接:戳我 最小圆覆盖. 1.枚举第一个点,考虑当前圆是否包含了这个点,如果没有,则把圆变成以这个点为圆心,半径为0的圆. 2.枚举第二个点,考虑圆是否包含了这个点,如果没有,则把圆变成以这两个点 ...

随机推荐

  1. jQuery插件:跨浏览器复制jQuery-zclip(转载)

    转载地址:http://www.cnblogs.com/linjiqin/p/3532451.html jQuery-zclip是一个复制内容到剪贴板的jQuery插件,使用它我们不用考虑不同浏览器和 ...

  2. MVC4 遇到问题总结

    1.路径编写: 举例1.<img  src="../Login/VailCode" width="108" height="40"&g ...

  3. 【JAVA与DOM4J实现对XML文档的CRUD操作】

    一.简介 1.网上下载DOM4J 1.6.1压缩包,解压开之后,发现几个目录和一个jar文件,jar文件是必须的文件其它目录: docs目录:帮助文档的目录,单击index.html: Quick s ...

  4. MySQL5.6 on Windows 安装失败: String was not recognized as a valid DateTime

    在Win7,32位上安装MySQL5.6.21时出现日期/时间格式错误, 如下图所示: 错误描述为: String was not recognized as a valid DateTime. 下面 ...

  5. ASP.NET 5探险(3):使用UMEditor并实现图片上传

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:今天将继续上一篇来讲解百度富文本Web编辑器UEditor或UMEditor的使用. ...

  6. UDP通讯程序设计

    UDP通讯程序设计 一.函数化 1.1服务器使用的函数 创建socket----->socket 绑定地址-------->bind 接受数据-------->recvfrom 发送 ...

  7. C语言面试

    最全的C语言试题总结 第一部分:基本概念及其它问答题 1.关键字static的作用是什么? 这个简单的问题很少有人能回答完全.在C语言中,关键字static有三个明显的作用: 1). 在函数体,一个被 ...

  8. 编译器 expected unqualified-id before numeric constant 错误

    今天调试代码,碰到expected unqualified-id before numeric constant 错误,代码的错误模块出现在一个函数模块上, 奇怪的是这个函数模块之前编译了很多次,也没 ...

  9. 安装PIL

    本来直接pip install PIL的,一直说找不到对应的版本,在廖雪峰老师的博客里发现原来PIL只更新到pytyon 2.7 后来就只有Pillow了,而我的版本是2.7.9 用的时候直接from ...

  10. SQLserver删除某数据库中所有表 方法 二

    方便删除数据库中所有的数据表,清空数据库,有些有约束,不能直接delete,需要先删除库中的约束,代码如下: --删除所有约束DECLARE c1 cursor for select 'alter t ...