1336: [Balkan2002]Alien最小圆覆盖

1337: 最小圆覆盖

Time Limit: 1 Sec Memory Limit: 162 MBSec Special Judge

Description

给出N个点,让你画一个最小的包含所有点的圆。

Input

先给出点的个数N,2<=N<=100000,再给出坐标Xi,Yi.(-10000.0<=xi,yi<=10000.0)

Output

输出圆的半径,及圆心的坐标

Sample Input

6

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 5.00

这两道题是最小圆覆盖的裸题,这里主要讲讲求最小圆覆盖的思路。

最小圆覆盖问题就是让你求一个最小的圆使得它能够刚好覆盖掉给出的点。本蒟蒻学习的是一种期望效率O(n)" role="presentation" style="position: relative;">O(n)O(n)的算法。

那么我们怎么做呢?

首先,我们假设前i−1" role="presentation" style="position: relative;">i−1i−1个点已经被现在的圆给覆盖掉了,现在正在处理第i" role="presentation" style="position: relative;">ii个点,那么我们check" role="presentation" style="position: relative;">checkcheck一波,如果当前点在圆外,我们就重构覆盖前i" role="presentation" style="position: relative;">ii个点的最小覆盖圆,具体操作就是先以i" role="presentation" style="position: relative;">ii为圆心作圆,然后从前i−1" role="presentation" style="position: relative;">i−1i−1个点中找一个点j" role="presentation" style="position: relative;">jj使得j" role="presentation" style="position: relative;">jj在圆外,此时最小覆盖圆应该为i,j" role="presentation" style="position: relative;">i,ji,j中点,然后我们再从前j−1" role="presentation" style="position: relative;">j−1j−1个点中找一个点k" role="presentation" style="position: relative;">kk使得k" role="presentation" style="position: relative;">kk在圆外,这时最小覆盖圆自然应该是三角形ijk" role="presentation" style="position: relative;">ijkijk的外接圆。我们一直这样操作到前i" role="presentation" style="position: relative;">ii个点都能够check" role="presentation" style="position: relative;">checkcheck成功为止。

但这样的话最坏情况不应该是O(n3)" role="presentation" style="position: relative;">O(n3)O(n3)吗?是的,因此我们要在最开始的时候将点随机打乱,这样的话期望的效率就应该是O(n)" role="presentation" style="position: relative;">O(n)O(n)的了。还有就是注意T1336" role="presentation" style="position: relative;">T1336T1336应该保留10" role="presentation" style="position: relative;">1010位小数而不是题目上说的2" role="presentation" style="position: relative;">22位。

T1336" role="presentation" style="position: relative;">T1336T1336代码:

#include<bits/stdc++.h>
#define N 100005
using namespace std;
struct point{double x,y;}p[N],O;
struct line{double a,b,c;};
double r;
inline double mul(double x){return x*x;}
inline double dis(point x,point y){return sqrt(mul(x.x-y.x)+mul(x.y-y.y));}
inline bool in_check(point x){return dis(O,x)<=r;}
inline point calc(line a,line b){return point{(b.c*a.b-a.c*b.b)/(a.a*b.b-a.b*b.a),(b.c*a.a-a.c*b.a)/(a.b*b.a-b.b*a.a)};}
int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;++i)scanf("%lf%lf",&p[i].x,&p[i].y);
    random_shuffle(p+1,p+n+1);
    r=0;
    for(int i=1;i<=n;++i){
        if(in_check(p[i]))continue;
        O.x=p[i].x,O.y=p[i].y,r=0;
        for(int j=1;j<i;++j){
            if(in_check(p[j]))continue;
            O.x=(p[i].x+p[j].x)/2,O.y=(p[i].y+p[j].y)/2;
            r=dis(O,p[i]);
            for(int k=1;k<j;++k){
                if(in_check(p[k]))continue;
                O=calc(line{2*(p[i].x-p[k].x),2*(p[i].y-p[k].y),mul(p[k].x)+mul(p[k].y)-mul(p[i].x)-mul(p[i].y)},line{2*(p[i].x-p[j].x),2*(p[i].y-p[j].y),mul(p[j].x)+mul(p[j].y)-mul(p[i].x)-mul(p[i].y)});
                r=dis(p[i],O);
            }
        }
    }
    printf("%.10lf\n%.10lf %.10lf",r,O.x,O.y);
    return 0;
}

T1337" role="presentation" style="position: relative;">T1337T1337代码:

#include<bits/stdc++.h>
#define N 100005
using namespace std;
struct point{double x,y;}p[N],O;
struct line{double a,b,c;};
double r;
inline double mul(double x){return x*x;}
inline double dis(point x,point y){return sqrt(mul(x.x-y.x)+mul(x.y-y.y));}
inline bool in_check(point x){return dis(O,x)<=r;}
inline point calc(line a,line b){return point{(b.c*a.b-a.c*b.b)/(a.a*b.b-a.b*b.a),(b.c*a.a-a.c*b.a)/(a.b*b.a-b.b*a.a)};}
int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;++i)scanf("%lf%lf",&p[i].x,&p[i].y);
    random_shuffle(p+1,p+n+1);
    r=0;
    for(int i=1;i<=n;++i){
        if(in_check(p[i]))continue;
        O.x=p[i].x,O.y=p[i].y,r=0;
        for(int j=1;j<i;++j){
            if(in_check(p[j]))continue;
            O.x=(p[i].x+p[j].x)/2,O.y=(p[i].y+p[j].y)/2;
            r=dis(O,p[i]);
            for(int k=1;k<j;++k){
                if(in_check(p[k]))continue;
                O=calc(line{2*(p[i].x-p[k].x),2*(p[i].y-p[k].y),mul(p[k].x)+mul(p[k].y)-mul(p[i].x)-mul(p[i].y)},line{2*(p[i].x-p[j].x),2*(p[i].y-p[j].y),mul(p[j].x)+mul(p[j].y)-mul(p[i].x)-mul(p[i].y)});
                r=dis(p[i],O);
            }
        }
    }
    printf("%.3lf",r);
    return 0;
}

2018.07.04 BZOJ1336&&1337: Balkan2002Alien最小圆覆盖的更多相关文章

  1. BZOJ1336 Balkan2002 Alien最小圆覆盖 【随机增量法】*

    BZOJ1336 Balkan2002 Alien最小圆覆盖 Description 给出N个点,让你画一个最小的包含所有点的圆. Input 先给出点的个数N,2<=N<=100000, ...

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

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

  3. Bzoj 1336&1337 Alien最小圆覆盖

    1336: [Balkan2002]Alien最小圆覆盖 Time Limit: 1 Sec  Memory Limit: 162 MBSec  Special Judge Submit: 1473  ...

  4. bzoj1336: [Balkan2002]Alien最小圆覆盖

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1336 1336: [Balkan2002]Alien最小圆覆盖 Time Limit: 1 ...

  5. 2018.07.04 POJ 1265 Area(计算几何)

    Area Time Limit: 1000MS Memory Limit: 10000K Description Being well known for its highly innovative ...

  6. 2018.07.04 POJ 1696 Space Ant(凸包卷包裹)

    Space Ant Time Limit: 1000MS Memory Limit: 10000K Description The most exciting space discovery occu ...

  7. 2018.07.04 POJ 1113 Wall(凸包)

    Wall Time Limit: 1000MS Memory Limit: 10000K Description Once upon a time there was a greedy King wh ...

  8. 2018.07.04 POJ 1654 Area(简单计算几何)

    Area Time Limit: 1000MS Memory Limit: 10000K Description You are going to compute the area of a spec ...

  9. 2018.07.04 POJ 3304 Segments(简单计算几何)

    Segments Time Limit: 1000MS Memory Limit: 65536K Description Given n segments in the two dimensional ...

随机推荐

  1. web常见攻击

    DoS和DDoS攻击 DoS(Denial of Service),即拒绝服务,造成远程服务器拒绝服务的行为被称为DoS攻击.其目的是使计算机或网络无法提供正常的服务.最常见的DoS攻击有计算机网络带 ...

  2. node 删除文件 和文件夹

    删除文件 var fs = require('fs'); fs.unlink(path,callback); 删除文件夹 deleteFolder(path); function deleteFold ...

  3. linux 下常用部分命令

    关机 (系统的关机.重启以及登出 ) shutdown -h now 关闭系统() init 关闭系统() shutdown -h hours:minutes & 按预定时间关闭系统 shut ...

  4. 装机 win7 64 IE11

    英文版win7,更改语言包 英文版 http://windows.microsoft.com/en-us/internet-explorer/download-ie 中文版 http://window ...

  5. android MD5 SHA1

    参考文章: AndroidStudio 中怎样查看获取MD5和SHA1值(应用签名)(https://www.cnblogs.com/zhchoutai/p/7102516.html) 使用 java ...

  6. egret-初步接触

    class HelloTime extends egret.DisplayObjectContainer { public constructor() { super(); this.addEvent ...

  7. Mysql 获取当月和上个月第一天和最后一天的解决方案

    #获取当前日期select curdate(); #获取当月最后一天select last_day(curdate()): #获取本月的第一天select date_add(curdate(),int ...

  8. Validate the date format

    Validate the date format function checkdate(input) { var validformat = /^\d{2}\/\d{2}\/\d{4}$/; //Ba ...

  9. 给pyspark 设置新的环境

    如果是从pysparkshell里面进去,此时已经有了pyspark环境了,所以要加一个:sc.stop() from pyspark import SparkContext, SparkConfsc ...

  10. fiddler 抓取 逍遥安卓模拟器 https包

    1.打开fiddler,进行相关设置 Tools--Fiddler Options 接下来进行客户端网络配置 1 查看电脑ip地址,ipconfig 逍遥游模拟器中使用自带的浏览器,访问192.168 ...