POOPE 发表于 2021-7-27 14:16:18

P1429 平面最近点对(加强版)

题意:给定平面上n个点,找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的
这题
分治O(nlogn)
貌似好久没做分治题了
有点生
而且精度还卡了我半天。。。。QAQ
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define love_nmr 0
struct node
{
    double x,y;
    friend bool operator < (const node &a,const node &b)
    {
      if(a.x<b.x) return true;
      if(a.x>b.x) return false;
      if(a.y<b.y) return true;
      return false;
    }
};
node E;
int temp;
int ji;
int n;
inline double dis(int x,int y)
{
    return sqrt((E.x-E.x)*(E.x-E.x)+(E.y-E.y)*(E.y-E.y));
}
inline double merge(int left,int right)
{
    if(left==right)
      return (double)0x7fffffff;
    if(left+1==right)
      return dis(left,right);
    int mid=(left+right)>>1;
    double d1=merge(left,mid);
    double d2=merge(mid+1,right);
    double d=min(d1,d2);   
    ji=0;
    for(int i=left;i<=right;i++)
      if(fabs(E.x-E.x)<=d)
            temp[++ji]=i;
    sort(temp+1,temp+ji+1);
    for(int i=1;i<=ji;i++)
      for(int j=i+1;j<=ji&&E].y-E].y<d;j++)
            d=min(d,dis(temp,temp));
    return d;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
      scanf("%lf %lf",&E.x,&E.y);
    sort(E+1,E+n+1);
    printf("%.4lf",merge(1,n));
    return love_nmr;
}
----olinr


文档来源:51CTO技术博客https://blog.51cto.com/u_15314204/3190978
页: [1]
查看完整版本: P1429 平面最近点对(加强版)