• [计算几何][分治]luogu P1429 平面最近点对(加强版)


    题面

    https://www.luogu.com.cn/problem/P1429

    分析

    考虑分治法

    对x排序,设mid为x中位数的直线

    设当前已经处理出x为1..mid,mid+1..r中的最近点对距离dist

    那么新产生的最近点对必然跨过mid,即x坐标在mid-dist..mid+dist中

    考虑在左侧选择一个点,那么可选的区域为一个半径为dist的圆,为了方便理解,我们将其处理为一个边长为2*dist的正方形

    而这个正方形跨过mid的部分最大只能是一个宽为dist,长为2*dist的矩形

    而前文提到过,最近点对距离已经为dist,所以该矩形中最多出现6个点,即每次对于选择的点,在另一侧中可以选择的点最多为6个

    然后仍然是最近点对距离为dist,所以将所有点投影到x=mid的直线上,将纵向距离小于dist且位于另一侧的点与之配对,记录最小值

    即按y值排序

    排序复杂度为O(nlogn),所以总复杂度为O(nlog^2n)

    代码

    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    using namespace std;
    typedef long long ll;
    const ll Inf=1ll<<62;
    const int N=2e6+10;
    struct Point {
        ll x,y;
    }p[N];
    int n;
    
    bool CMP_X(Point a,Point b) {return a.x<b.x;}
    
    bool CMP_Y(Point a,Point b) {return a.y<b.y;}
    
    inline ll Dist(Point a,Point b) {return pow(a.x-b.x,2)+pow(a.y-b.y,2);}
    
    ll Calc(int l,int r) {
        if (r-l==0) return Inf;
        if (r-l==1) return Dist(p[l],p[r]);
        if (r-l==2) return min(Dist(p[l],p[r]),min(Dist(p[l],p[l+1]),Dist(p[r-1],p[r])));
        int mid=l+r>>1;
        ll mn=min(Calc(l,mid),Calc(mid+1,r));
        sort(p+l,p+r+1,CMP_X);
        int dl=mid,dr=mid;
        while (dl>=l&&pow(p[dl].x-p[mid].x,2)<=mn) dl--;dl++;
        while (dr<=r&&pow(p[dr].x-p[mid].x,2)<=mn) dr++;dr--;
        if (dl<=dr) sort(p+dl,p+dr+1,CMP_Y);
        for (int i=dl;i<dr;i++)
            for (int j=i+1;j<=min(i+7,dr);j++)
                mn=min(mn,Dist(p[i],p[j]));
        return mn;
    }
    
    int main() {
        scanf("%d",&n);
        for (int i=1;i<=n;i++) scanf("%lld%lld",&p[i].x,&p[i].y);
        sort(p+1,p+n+1,CMP_X);
        printf("%.4lf",1.0*sqrt(Calc(1,n)));
    }
    View Code
  • 相关阅读:
    redis应用场景
    使用Nginx+Lua+Redis构建灰度发布环境
    Comparison method violates its general contract
    mysql+redis
    缓存技术PK:选择Memcached还是Redis?
    缓存技术PK
    菜鸟教程之工具使用(九)——Git如何进行分支的merge操作
    菜鸟教程之工具使用(八)——EGit禁止自动转换回车换行符
    菜鸟教程之工具使用(七)——从GIt上导出Maven项目
    菜鸟教程之工具使用(六)——让Maven项目直接在eclipse内部的Tomcat中运行
  • 原文地址:https://www.cnblogs.com/mastervan/p/13855001.html
Copyright © 2020-2023  润新知