最小点对 WA 20 求助

思路:分治

(对拍过洛谷题解)

#include<bits/stdc++.h>
#define int long long
using namespace std;

struct p{
  int x,y;
}a[100005];
p b[100005];
int n;
bool cmp(p a,p b){
  return a.x<b.x;
}
bool cmpy(p a,p b){
  return a.y<b.y;
}
double core(int l,int r){
  if (l==r)return 0x3f3f3f3f3f3f3f3fLL;
  if (l+1==r)return sqrt((a[l].x-a[r].x)*(a[l].x-a[r].x)+(a[l].y-a[r].y)*(a[l].y-a[r].y));
  int mid=(l+r)/2;
  double ans=min(core(l,mid),core(mid+1,r));
  int cnt=0;
  for (int i=l;i<=r;i++){
    if (fabs(a[i].x-a[mid].x)<ans)b[++cnt]=a[i];
  }
  sort(b+1,b+cnt+1,cmpy);
  for (int i=1;i<=cnt;i++){
    for (int j=i+1;j<=cnt;j++){
      if (fabs(b[j].y-b[i].y)>ans)break;
      ans=min(ans,sqrt((b[i].x-b[j].x)*(b[i].x-b[j].x)+(b[i].y-b[j].y)*(b[i].y-b[j].y)));
    }
  }
  return ans;
}
signed main(){
	//freopen("1.in","r",stdin);
	//freopen("2.out","w",stdout);
  cin>>n;
  for (int i=1;i<=n;i++){
    cin>>a[i].x>>a[i].y;
  }
  sort(a+1,a+1+n,cmp);
  printf("%.2lf\n",core(1,n));
  return 0;
}
2 个赞

我是60分我有个建议

long long

不然这里会溢出
image

1 个赞

所以你对拍小数据没问题

1 个赞