记录编号 234980 评测结果 AAAAAAAAAA
题目名称 [SDOI 2012]拯救小云公主 最终得分 100
用户昵称 GravatarSatoshi 是否通过 通过
代码语言 C++ 运行时间 2.088 s
提交时间 2016-03-10 07:30:51 内存使用 70.43 MiB
显示代码纯文本
#include <fstream>
#include <algorithm>
#include <iomanip>
#include <cmath>
#define N 3030
using namespace std;
typedef double ld;
ifstream in("dis.in");
ofstream out("dis.out");
int n;
int f[N]={0},g[N]={0},X,Y;
ld o[N][N]={0};
class point
{
public:
	ld x,y;
	void make(ld a,ld b)
	{
		x=a;
		y=b;
	}
	void print()
	{
		out<<x<<' '<<y<<endl;
	}
}p[N];
void read()
{
	int i,j;
	in>>n>>X>>Y;
	for(i=1;i<=n;i++)in>>p[i].x>>p[i].y;
	for(i=1;i<=n;i++)
	{
		for(j=i+1;j<=n;j++)
		{
			o[i][j]=o[j][i]=sqrt((p[i].x-p[j].x)*(p[i].x-p[j].x)+(p[i].y-p[j].y)*(p[i].y-p[j].y));
		}
	}
}
int find(int x)
{
	if(f[x]==x)return x;
	return f[x]=find(f[x]);
}
void merge(int x,int y)
{
	x=find(x);y=find(y);
	if(g[x]>g[y])f[y]=x;
	else
	{
		f[x]=y;
		if(g[x]==g[y])g[y]++;
	}
}
bool check(ld R)
{
	int i,j;
	for(i=1;i<=n+2;i++)f[i]=i,g[i]=0;
	for(i=1;i<=n;i++)
	{
		for(j=i+1;j<=n;j++)
		{
			if(o[i][j]<=2*R)merge(i,j);
		}
	}
	for(i=1;i<=n;i++)
	{
		if(p[i].x-R<=1||p[i].y+R>=Y)merge(i,n+1);
		if(p[i].x+R>=X||p[i].y-R<=1)merge(i,n+2);
	}
	if(find(n+1)==find(n+2))return 0;
	return 1;
}
void print(ld x,int y)
{
	out <<setprecision(y) <<std::fixed<<x<<endl;
}
void work()
{
	ld l,r,mid,eps=0.001;
	l=0;
	r=fmax(X,Y);
	while(r-l>=eps)
	{
		mid=(l+r)/2;
		if(check(mid))l=mid;
		else r=mid;
	}
	print(l,2);
}
int main()
{
	read();
	work();
	return 0;
}