码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj2458: [BeiJing2011]最小三角形 最近点对

时间:2016-05-15 21:44:28      阅读:393      评论:0      收藏:0      [点我收藏+]

标签:

类似分治最近点对的方法乱搞一下就行。

#include<bits/stdc++.h>
#define N 200010
#define M (s+t>>1)
using namespace std;
struct vec{
	int x,y;
}u[N],v[N];
bool foo(vec a,vec b){
	return a.x<b.x;
}
bool bar(vec a,vec b){
	return a.y<b.y;
}
double sqr(double x){
	return x*x;
}
double dist(vec a,vec b){
	return sqrt(sqr(a.x-b.x)+sqr(a.y-b.y));
}
double dist(vec a,vec b,vec c){
	return dist(a,b)+dist(b,c)+dist(a,c);
}
double d=1e64;
void solve(int s,int t){
	if(t-s>2){
		solve(s,M);
		solve(M,t);
		int m=0;
		for(int i=s;i!=t;++i)
			if(abs(u[i].x-u[M].x)<<1<d)
				v[m++]=u[i];
		sort(v,v+m,bar);
		for(int i=0;i!=m;++i)
			for(int j=i+1;j!=m
			&&v[j].y-v[i].y<<1<d;++j)
				for(int k=i+1;k!=j;++k)
					d=min(d,dist(v[i],v[j],v[k]));
	}
}
int main(){
	int n;
	scanf("%d",&n);
	for(int i=0;i!=n;++i)
		scanf("%d%d",&u[i].x,&u[i].y);
	sort(u,u+n,foo);
	solve(0,n);
	printf("%.6f\n",d);
}

  

bzoj2458: [BeiJing2011]最小三角形 最近点对

标签:

原文地址:http://www.cnblogs.com/f321dd/p/5496034.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!