分治70分,TLE #8#9#10,求优化
查看原帖
分治70分,TLE #8#9#10,求优化
551894
lemon2021楼主2023/8/1 18:33

分治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;
}
2023/8/1 18:33
加载中...