【BZOJ1336】[Balkan2002]Alien最小圆覆盖 随机增量法
【BZOJ1336】[Balkan2002]Alien最小圆覆盖
Description
给出N个点,让你画一个最小的包含所有点的圆。
Input
先给出点的个数N,2<=N<=100000,再给出坐标Xi,Yi.(-10000.0<=xi,yi<=10000.0)
Output
输出圆的半径,及圆心的坐标
Sample Input
8.0 9.0
4.0 7.5
1.0 2.0
5.1 8.7
9.0 2.0
4.5 1.0
Sample Output
5.00 5.00
题解:特地学了一发随机增量法,期望复杂度据说是O(n),但不会证。
起初以1为圆心。先枚举一个点,如果这个点在圆外,则改为以哪个点为圆心;再枚举一个点,如果这个点再圆外,则圆心改为这两个点的中点;再枚举一个点,如果这个点再圆外,则将圆心改为三角形的内心。如何求内心?本人懒得推式子所以写的高斯消元。
由于是期望复杂度所以一开始要将原序列随机排序。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn=500010;
const double eps=1e-12;
struct point
{
double x,y;
point() {}
point(double a,double b){x=a,y=b;}
}p[maxn],O;
int n;
double v[10][10],R;
point calc(point a,point b,point c)
{
v[1][1]=2*b.x-2*a.x;
v[1][2]=2*b.y-2*a.y;
v[1][3]=b.x*b.x-a.x*a.x+b.y*b.y-a.y*a.y;
v[2][1]=2*c.x-2*b.x;
v[2][2]=2*c.y-2*b.y;
v[2][3]=c.x*c.x-b.x*b.x+c.y*c.y-b.y*b.y;
int i,j,k;
for(i=1;i<=2;i++)
{
for(j=i+1;j<=2;j++) if(fabs(v[j][i])>fabs(v[i][i])) for(k=i;k<=3;k++) swap(v[i][k],v[j][k]);
double tmp=v[i][i];
for(k=i;k<=3;k++) v[i][k]/=tmp;
for(j=1;j<=2;j++) if(i!=j) for(tmp=v[j][i],k=i;k<=3;k++) v[j][k]-=tmp*v[i][k];
}
point ret(v[1][3],v[2][3]);
return ret;
}
double dis(point a,point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int main()
{
scanf("%d",&n);
int i,j,k;
for(i=1;i<=n;i++) scanf("%lf%lf",&p[i].x,&p[i].y);
random_shuffle(p+1,p+n+1);
O=p[1],R=0;
for(i=2;i<=n;i++) if(dis(O,p[i])>R+eps)
{
O=p[i],R=0;
for(j=1;j<i;j++) if(dis(O,p[j])>R+eps)
{
O=point((p[i].x+p[j].x)/2,(p[i].y+p[j].y)/2),R=dis(O,p[i]);
for(k=1;k<j;k++) if(dis(O,p[k])>R+eps)
O=calc(p[i],p[j],p[k]),R=dis(O,p[k]);
}
}
printf("%.2lf\n%.2lf %.2lf",R,O.x,O.y);
return 0;
}
【BZOJ1336】[Balkan2002]Alien最小圆覆盖 随机增量法的更多相关文章
- 【bzoj1336/1337/2823】[Balkan2002]Alien最小圆覆盖 随机增量法
题目描述 给出N个点,让你画一个最小的包含所有点的圆. 输入 先给出点的个数N,2<=N<=100000,再给出坐标Xi,Yi.(-10000.0<=xi,yi<=10000. ...
- BZOJ1336 Balkan2002 Alien最小圆覆盖 【随机增量法】*
BZOJ1336 Balkan2002 Alien最小圆覆盖 Description 给出N个点,让你画一个最小的包含所有点的圆. Input 先给出点的个数N,2<=N<=100000, ...
- bzoj1336: [Balkan2002]Alien最小圆覆盖
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1336 1336: [Balkan2002]Alien最小圆覆盖 Time Limit: 1 ...
- BZOJ.2823.[AHOI2012]信号塔(最小圆覆盖 随机增量法)
BZOJ 洛谷 一个经典的随机增量法,具体可以看这里,只记一下大体流程. 一个定理:如果一个点\(p\)不在点集\(S\)的最小覆盖圆内,那么它一定在\(S\bigcup p\)的最小覆盖圆上. 所以 ...
- [BZOJ2823][BZOJ1336][BZOJ1337]最小圆覆盖(随机增量法)
算法介绍网上有很多,不解释了. 给出三点坐标求圆心方法:https://blog.csdn.net/liyuanbhu/article/details/52891868 记得先random_shuff ...
- hdu 3007【最小圆覆盖-随机增量法模板】
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> usin ...
- [BZOJ 1336] [Balkan2002] Alien最小圆覆盖 【随机增量法】
题目链接:BZOJ - 1336 题目分析 最小圆覆盖有一个算法叫做随机增量法,看起来复杂度像是 O(n^3) ,但是可以证明其实平均是 O(n) 的,至于为什么我不知道= = 为什么是随机呢?因为算 ...
- BZOJ 1337: 最小圆覆盖1336: [Balkan2002]Alien最小圆覆盖(随机增量法)
今天才知道有一种东西叫随机增量法就来学了= = 挺神奇的= = A.令ci为包括前i个点的最小圆,若第i+1个点无法被ci覆盖,则第i+1个点一定在ci+1上 B.令ci为包括前i个点的最小圆且p在边 ...
- 洛谷 P1742 最小圆覆盖 (随机增量)
题目链接:P1742 最小圆覆盖 题意 给出 N 个点,求最小的包含所有点的圆. 思路 随机增量 最小圆覆盖一般有两种做法:随机增量和模拟退火.随机增量的精确度更高,这里介绍随机增量的做法. 先将所有 ...
随机推荐
- 【转载】SQL Server XML Path
FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作.那么以一个实例为主 ...
- hihoCoder #1586 : Minimum-结构体版线段树(单点更新+区间最值求区间两数最小乘积) (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)
#1586 : Minimum Time Limit:1000ms Case Time Limit:1000ms Memory Limit:256MB Description You are give ...
- MariaDB+Galera+Haproxy+Keepalived搭建集群
1.MariaDB Galera Cluster介绍 MariaDB Galera Cluster是MariaDB同步多主机集群,它仅支持XtraDB/InnoDB存储引擎,在MySQLInnoDB存 ...
- Mysql乱码问题解决历程
可能是因为看了太多网上的关于这个问题的解决办法,可能当时是我自己没有看明白也或许是情况不一样,反正都没有解决我当初遇到的问题,现在想想可能是自己当初太无知了,第二个原因是原来大多数情况下是在windo ...
- 一款不错的编程字体Source Code Pro
我以前一直是用的MS自家的是Consolas的字体,这个字体基本上具有编程字体所需的所有要素:等宽.支持ClearType.中文字体大小合适,l和1,o和0很容易区分.非要挑刺的话就是字体比较小,9号 ...
- CPU、内存、IO虚拟化关键技术及其优化探索
https://yq.aliyun.com/articles/71295?spm=5176.8091938.0.0.3LQ7NM
- Putty完全使用方法
http://www.putty.ws/Putty-wanquanshiyong putty中文站
- tomcat 登录时用户名和密码问题
在编程的时候我们经常在myeclipes中直接部署web程序,大多数情况下不会登陆tomcat,这样时间长了我们就忘记了tomcat的登陆用户名和密码,下面就说一下怎么找到tomcat的用户名和密码吧 ...
- sudo如何保持当前用户的环境变量?
现象,我在/etc/profile里设置全局代理,然后使用命令 1.curl http://www.baidu.com 走代理 2.sudo curl http://www.baidu.com 并没 ...
- 简单便捷的纯PHP网盘程序 Veno File Manager 2.6.3(VFM2)
体验过很多国外网盘程序,例如:Owncloud.Bedrive.YetiShare.XFilesharing.uCloud.Cloudshare 等等,诸如此类,VFM2与这些臃肿的商用或非商用来的程 ...