分治70分,TLE #8#9#10,求优化
#include<bits/stdc++.h>
using namespace std;
const int N=400001;
int n;
long double d=1ll<<60;//1ll<<60等于1152921504606846976
long double t=1ll<<60,d2;
pair<double, double> a[N];
pair<double, double> b[N];
long double dis2(pair<double, double> a, pair<double, double> b)
{
double tx=a.first-b.first;
double ty=a.second-b.second;
return (1ll*tx*tx+1ll*ty*ty);
}
void solve(int l,int r)
{
static pair<double, double> vl[N],vr[N];
static pair<double, double> vll[N],vrr[N];
if(l==r)
{
swap(a[l].first,a[l].second);
swap(b[l].first,b[l].second);
return;
}
long long mid=(l+r)/2;
long long x=a[mid].first,xx=b[mid].first;
solve(l,mid);
solve(mid+1,r);
long double dis=sqrt(d);
long double diss=sqrt(t);
int sl=0,sr=0;
int sll=0,srr=0;
for(int i=l;i<=mid;i++)
{
if(x-a[i].second<dis)
{
vl[++sl]=a[i];
}
if(xx-b[i].second<diss)
{
vll[++sll]=b[i];
}
}
for(int i=mid+1;i<=r;i++)
{
if(a[i].second-x<dis)
{
vr[++sr]=a[i];
}
if(b[i].second-xx<diss)
{
vrr[++srr]=b[i];
}
}
for(int i=1,p=1,q=0;i<=sl;i++)
{
while(p<=sr&&vl[i].first-vr[p].first>=dis)
{
p++;
}
while(q<sr&&vr[q+1].first-vl[i].first<dis)
{
q++;
}
for(int j=p;j<=q;j++)
{
d=min(d,dis2(vl[i],vr[j]));
}
}
for(int i=1,p=1,q=0;i<=sll;i++)
{
while(p<=srr&&vll[i].first-vrr[p].first>=diss)
{
p++;
}
while(q<srr&&vrr[q+1].first-vll[i].first<diss)
{
q++;
}
for(int j=p;j<=q;j++)
{
d2=max(d2,dis2(vll[i],vrr[j]));
}
}
inplace_merge(a+l,a+mid+1,a+r+1);
inplace_merge(b+l,b+mid+1,b+r+1);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i].first>>a[i].second;
}
sort(a+1,a+n+1);
for(int i=1;i<=n;i++)
{
b[i].first=a[i].first;
b[i].second=a[i].second;
}
solve(1,n);
long double ans;
ans=sqrt(d);
printf("%0.2Lf ",ans);
ans=sqrt(d2);
printf("%0.2Lf",ans);
return 0;
}