用并查集做的,Wa on #1 #9
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define double long double
int t;
double n,m;
struct node
{
double x,y;
}a[300001];
int fa[300001];
bool sm[300001],xm[300001];
bool sn[300001],xn[300001];
double ans;
const double eps=1e-7;
int find(int x)
{
if(fa[x]==x) return x;
fa[x]=find(fa[x]);
return fa[x];
}
void add(int x,int y)
{
int xx=find(x);
int yy=find(y);
if(xx==yy) return;
if(xx>yy) swap(xx,yy);
fa[yy]=xx;
sm[xx]|=sm[yy]; xm[xx]|=xm[yy];
sn[xx]|=sn[yy]; xn[xx]|=xn[yy];
sm[yy]|=sm[xx]; xm[yy]|=xm[xx];
sn[yy]|=sn[xx]; xn[yy]|=xn[xx];
}
bool pdd(int x,int y)
{
int xx=find(x);
int yy=find(y);
if(xx!=yy) return 0;
if(sm[xx]&&xm[xx]) return 1;
if(sn[xx]&&xn[xx]) return 1;
if(sn[xx]&&xm[xx]) return 1;
if(sm[xx]&&xn[xx]) return 1;
return 0;
}
double hs(node x,node y)
{
return sqrt((x.x-y.x*1.0)*(x.x-y.x*1.0)*1.0+(x.y-y.y*1.0)*(x.y-y.y*1.0)*1.0)*1.0;
}
bool pd(double k)
{
for(int i=1;i<=t;i++)
{
sm[i]=0; xm[i]=0;
sn[i]=0; xn[i]=0;
fa[i]=i;
}
node sc={1,1};
node cs={n,m};
for(int i=1;i<=t;i++)
{
int x=i;
double q=(a[x].x);
if(q<k) sn[x]=1;
double qq=(n-a[x].x);
if(qq<k) xn[x]=1;
q=(a[x].y);
if(q<k) xm[x]=1;
qq=(m-a[x].y);
if(qq<k) sm[x]=1;
if(sm[x]&&xm[x]) return 0;
if(sn[x]&&xn[x]) return 0;
if(sn[x]&&xm[x]) return 0;
if(sm[x]&&xn[x]) return 0;
double w=hs(sc,a[x]); if(w<=k) return 0;
w=hs(cs,a[x]); if(w<=k) return 0;
}
for(int i=1;i<=t;i++)
{
for(int j=1;j<=i;j++)
{
if(hs(a[i],a[j])<k*2.0)
{
int xx=find(i);
int yy=find(j);
add(xx,yy);
xx=find(xx); yy=find(yy);
if(pdd(xx,yy)) return 0;
}
}
}
return 1;
}
signed main()
{
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin>>t>>n>>m;
//swap(n,m);
for(int i=1;i<=t;i++)
{
cin>>a[i].x>>a[i].y;
}
double l=0,r=1e10;
while(r-l>eps)
{
double mid=(l+r)/2.0;
if(pd(mid))
{
ans=mid;
l=mid;
}
else r=mid;
}
cout<<fixed<<setprecision(2)<<ans;
return 0;
}