【BZOJ】2823: [AHOI2012]信号塔
题意
给\(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]信号塔的更多相关文章
- 2018.07.04 BZOJ 2823: AHOI2012信号塔(最小圆覆盖)
		
2823: [AHOI2012]信号塔 Time Limit: 10 Sec Memory Limit: 128 MB Description 在野外训练中,为了确保每位参加集训的成员安全,实时的掌握 ...
 - BZOJ 2823: [AHOI2012]信号塔
		
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2823 随机增量法.不断加点维护圆,主要是三点共圆那里打得烦(其实也就是个两中垂线求交点+联立方 ...
 - BZOJ.2823.[AHOI2012]信号塔(最小圆覆盖 随机增量法)
		
BZOJ 洛谷 一个经典的随机增量法,具体可以看这里,只记一下大体流程. 一个定理:如果一个点\(p\)不在点集\(S\)的最小覆盖圆内,那么它一定在\(S\bigcup p\)的最小覆盖圆上. 所以 ...
 - bzoj 2823: [AHOI2012]信号塔 最小圆覆盖
		
题目大意: 给定n个点,求面积最小的园覆盖所有点.其中\(n \leq 10^6\) 题解: 恩... 刚拿到这道题的时候... 什么???最小圆覆盖不是\(O(n^3)\)的随机增量算法吗????? ...
 - bzoj2823[AHOI2012]信号塔
		
2823: [AHOI2012]信号塔 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1190 Solved: 545[Submit][Status ...
 - 【BZOJ2823】[AHOI2012]信号塔(最小圆覆盖)
		
[BZOJ2823][AHOI2012]信号塔(最小圆覆盖) 题面 BZOJ 洛谷 相同的题: BZOJ1 BZOJ2 洛谷 题解 模板题... #include<iostream> #i ...
 - 【bzoj2823】 AHOI2012—信号塔
		
http://www.lydsy.com/JudgeOnline/problem.php?id=2823 (题目链接) 题意 求最小圆覆盖 Solution 关于最小圆覆盖的做法,论文里面都有.其实真 ...
 - (bzoj1337 || 洛谷P1742 最小圆覆盖 )|| (bzoj2823 || 洛谷P2533 [AHOI2012]信号塔)
		
bzoj1337 洛谷P1742 用随机增量法.讲解:https://blog.csdn.net/jokerwyt/article/details/79221345 设点集A的最小覆盖圆为g(A) 可 ...
 - AHOI2012 信号塔 | 最小圆覆盖模板
		
题目链接:戳我 最小圆覆盖. 1.枚举第一个点,考虑当前圆是否包含了这个点,如果没有,则把圆变成以这个点为圆心,半径为0的圆. 2.枚举第二个点,考虑圆是否包含了这个点,如果没有,则把圆变成以这两个点 ...
 
随机推荐
- win7Java开发环境配置
			
win7下Java开发环境的配置 首先下载符合操作系统版本的jdk,比如最新的jdk8: 下载链接:http://www.oracle.com/technetwork/java/javase/down ...
 - tkprof工具详解二(一些实例)
			
TKPROF是一个可执行文件,自带在Oracle Server软件中,无需额外的安装. 该工具文件可以用来解析ORACLE的SQL TRACE(10046) 以便生成更可读的内容. 实际上tkpro ...
 - 6-02使用SQL语句向表中插入数据
			
插入语句的语法: INSERT INTO 表() VALUES(值列表) 注意事项: 1:每次插入一行数据,不能只插入半行或几列数据. 2:每一个数据值的数据类型.精度和小数位数必须与相应的列匹配. ...
 - wp8 入门到精通 启动系统分享照片任务
			
PhotoChooserTask photoChooserTask = new PhotoChooserTask(); photoChooserTask.Completed += photoChoos ...
 - linux命令执行返回值(附错误对照表)
			
转自:http://blog.sina.com.cn/s/blog_6739945f0100zt4b.html 在 Linux 下,不管你是启动一个桌面程序也好,还是在控制台下运行命令,所有的程序在结 ...
 - PAT A 1004. Counting Leaves (30)【vector+dfs】
			
题目链接:https://www.patest.cn/contests/pat-a-practise/1004 大意:输出按层次输出每层无孩子结点的个数 思路:vector存储结点,dfs遍历 #in ...
 - Android LayoutInflater详解(转)
			
在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById().不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例 ...
 - Android LayoutInflater详解 (转)
			
在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById().不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例 ...
 - 构造函数创建对象和Object.create()实现继承
			
第一个方法用构造函数创建对象,实现方法的继承 /*创建一个对象把所有公用的属性和方法,放进去*/ function Person() { this.name = "W3cplus" ...
 - 非旋转Treap及可持久化[Merge,Split]
			
http://memphis.is-programmer.com/posts/46317.html http://fanhq666.blog.163.com/blog/static/819434262 ...