加强版已过,这里80?
查看原帖
加强版已过,这里80?
523541
Onana_in_XMFLS楼主2021/11/8 23:01
#include <bits/stdc++.h>
typedef long long LL;
typedef unsigned long long ULL;
typedef long double LD;
#define mem(l,val) memset((l),(val),(sizeof(l)))
using namespace std;
const int INF = 0x3f3f3f3f;
const double OO = 1e25;
const int eps = 1e-8;
const int S = 4*1e5+5;
struct point {double x,y;}p[S],tmp[S];
inline int sgn(double x) {return fabs(x)<eps?0:(x<0?-1:1);}
inline double distance(point a,point b) {return hypot(a.x-b.x,a.y-b.y);}
inline bool cmp_xy(const point& a,const point& b) 
{return sgn(a.x-b.x)<0 || (!sgn(a.x-b.x) && sgn(a.y-b.y) < 0);}
inline bool cmp_y(const point& a,const point& b) {return (sgn(a.y-b.y) < 0);}
inline double closest(int l,int r)
{
    double dis = OO;
    if(l == r) return dis;
    if(l == r-1) return distance(p[l],p[r]);
    int mid = l+r>>1;
    double d1 = closest(l,mid),d2 = closest(mid+1,r);
    dis = min(d1,d2);
    int k = 0;
    for(int i = l;i <= r;++i)
        if(fabs(p[mid].x-p[i].x) <= dis) tmp[++k] = p[i];
    sort(tmp+1,tmp+k+1,cmp_y);
    for(int i = 1;i <= k;++i)
        for(int j = i+1;j <= k;++j)
        {
            if(tmp[j].y-tmp[i].y >= dis) break;
            dis = min(dis,distance(tmp[i],tmp[j]));
        }
    return dis;
}
int main(int argc,char *argv[])
{
    int n;scanf("%d",&n);
    for(int i = 1;i <= n;++i) scanf("%lf%lf",&p[i].x,&p[i].y);
    sort(p+1,p+n+1,cmp_xy);
    printf("%.4lf\n",closest(0,n-1));
    return 0;
}

我不理解

2021/11/8 23:01
加载中...