今天才知道有一种东西叫随机增量法就来学了= =

挺神奇的= =

A.令ci为包括前i个点的最小圆,若第i+1个点无法被ci覆盖,则第i+1个点一定在ci+1上

B.令ci为包括前i个点的最小圆且p在边上,若第i+1个点无法被ci覆盖,则第i+1个点与点p一定在ci+1上

C.令ci为包括前i个点的最小圆且p,q在边上,若第i+1个点无法被ci覆盖,则第i+1个点与点p,q一定在ci+1上

这样就确定一个圆了

这样看上去是O(n^3)的,但是注意这个名字= =随机,说明我们能通过随机使其降到O(n)

首先C显然是线性

那么B-》c呢?对于一个点pi,在院内的概率是(i-1)/i在圆外的概率是1/i(因为这些点是随机的= =) 所以加入的复杂度为(i-1)/i*O(1)+1/i*O(i);

A-》B同理,因此该算法的时间复杂度为线性的

随机化多么神奇啊= =

c++可以直接random_shuffle(STL多么神奇!!!)来随机化数组

CODE:

#include<cstdio>

#include<iostream>

#include<cstring>

#include<algorithm>

#include<cmath>

using namespace std;

#define sqr(x) ((x)*(x))

#define fi first

#define se second

#define maxn 100100

typedef pair<double,double> ii;

ii a[maxn],cir;

double r;

double dis(ii x,ii y) {

return sqrt(sqr(x.fi-y.fi)+sqr(x.se-y.se));

}

ii getcir(ii x,ii y,ii z){

double a=sqr(x.fi)-sqr(y.fi)+sqr(x.se)-sqr(y.se),

b=sqr(x.fi)-sqr(z.fi)+sqr(x.se)-sqr(z.se),

c=2*(x.se-z.se)*(x.fi-y.fi)-2*(x.se-y.se)*(x.fi-z.fi);

return ii((a*(x.se-z.se)-b*(x.se-y.se))/c,

(a*(x.fi-z.fi)-b*(x.fi-y.fi))/(-c));

}

#define exp 1e-10

int cmp(double x) {

if (x<-exp) return -1;

if (x>exp) return 1;

return 0;

}

int n;

int main(){

scanf("%d",&n);

for (int i=1;i<=n;i++) scanf("%lf%lf",&a[i].fi,&a[i].se);

random_shuffle(a+1,a+1+n);

cir=a[1],r=0;

for (int i=1;i<=n;i++) {

if (cmp(dis(cir,a[i])-r)<=0) continue;

cir=a[i],r=0;

for (int j=1;j<i;j++) {

if (cmp(dis(cir,a[j])-r)<=0) continue;

cir.fi=(a[i].fi+a[j].fi)/2,cir.se=(a[i].se+a[j].se)/2;

r=dis(cir,a[j]);

for (int k=1;k<j;k++) {

if (cmp(dis(cir,a[k])-r)<=0) continue;

cir=getcir(a[i],a[j],a[k]);

r=dis(cir,a[i]);

}

}

}

printf("%lf\n%lf %lf\n",r,cir.fi,cir.se);

return 0;

}

BZOJ 1337: 最小圆覆盖1336: [Balkan2002]Alien最小圆覆盖(随机增量法)的更多相关文章

  1. [BZOJ 1336] [Balkan2002] Alien最小圆覆盖 【随机增量法】

    题目链接:BZOJ - 1336 题目分析 最小圆覆盖有一个算法叫做随机增量法,看起来复杂度像是 O(n^3) ,但是可以证明其实平均是 O(n) 的,至于为什么我不知道= = 为什么是随机呢?因为算 ...

  2. 【BZOJ】1336: [Balkan2002]Alien最小圆覆盖

    题解 我们先把所有点random_shuffle一下 然后对前i - 1个点计算一个最小圆覆盖,然后第i个点如果不在这个圆里,那么我们把这个点当成一个新的点,作为圆心,半径为0 从头枚举1 - i - ...

  3. bzoj2823: [AHOI2012]信号塔&&1336: [Balkan2002]Alien最小圆覆盖&&1337: 最小圆覆盖

    首先我写了个凸包就溜了 这是最小圆覆盖问题,今晚学了一下 先随机化点,一个个加入 假设当前圆心为o,半径为r,加入的点为i 若i不在圆里面,令圆心为i,半径为0 再重新从1~i-1不停找j不在圆里面, ...

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

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

  5. 【BZOJ-1336&1337】Alie最小圆覆盖 最小圆覆盖(随机增量法)

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

  6. 【bzoj1336/1337/2823】[Balkan2002]Alien最小圆覆盖 随机增量法

    题目描述 给出N个点,让你画一个最小的包含所有点的圆. 输入 先给出点的个数N,2<=N<=100000,再给出坐标Xi,Yi.(-10000.0<=xi,yi<=10000. ...

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

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

  8. 【BZOJ1336】[Balkan2002]Alien最小圆覆盖 随机增量法

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

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

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

随机推荐

  1. a标签屏蔽href跳转

    原文地址: http://blog.163.com/huang_qy/blog/static/615601452012101411625600/ 推荐的写法: a href="javascr ...

  2. IOS开发中UIAlertController(警告框)的使用

    步骤一.初始化: UIAlertController * inputname = [UIAlertController alertControllerWithTitle:@"未输入账户&qu ...

  3. wdcp使用记录--持续更新

    1.扩展memcache 资源地址:http://download.csdn.net/detail/fangminglei/8390449 上传至root文件夹运行 注:官方提供的文件不能安装,需要改 ...

  4. javah编译class文件找不到android.app.Activity的类文件

    在android工程的根目录使用javah生成jni 头文件时候,报找不到android.app.Activity的类文件错误. 无法访问android.app.Activity是说明没有引入andr ...

  5. Oracle数据库常用技术

    一.视图(重点) 什么是视图? ·视图由一个或多个表(或视图)中提取数据而成 ·视图是一种虚拟表 ·视图一经创建,可以当作表来使用. 使用视图的好处? · 简化复杂数据查询 · 提高运行效率 · 屏蔽 ...

  6. HUSTOJ 2796 && SPOJ1811

    传送门:http://begin.lydsy.com/JudgeOnline/problem.php?id=2796 题解:后缀自动机,很裸,但是感觉对后缀自动机还不是特别理解,毕竟我太蒟蒻,等我精通 ...

  7. spark RDD编程,scala版本

    1.RDD介绍:     RDD,弹性分布式数据集,即分布式的元素集合.在spark中,对所有数据的操作不外乎是创建RDD.转化已有的RDD以及调用RDD操作进行求值.在这一切的背后,Spark会自动 ...

  8. 模块划分--MVVM指南(课程学习)

    实现流水化开发,需要使用“模块划分”的程序开发方式.如此,团队里的每个人负责某项\某几项特定的技术领域,在特定的技术领域更加专业.这样,每个人的效率更高.在专业的技能更熟练,更深入,也会提高队员的成就 ...

  9. FMS中实现pull stream

    //程序启动时执行 application.onAppStart = function() { this.myNC= new NetConnection(); this.myNC.onStatus = ...

  10. aJax请求结果中包含form的问题

    jsp页面a.jsp如下: <form action='login' id='formId' method='post'> <input name='user'> </f ...