114 pts 求助(

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

HerikoDeltana @ 2022-01-03 15:57:02

从加强版改的,目前只能干到 114 (

#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <cstring>

#define Heriko return
#define Deltana 0
#define Romanno 1
#define S signed
#define LL long long
#define R register
#define I inline
#define CI const int
#define mkp(a,b) make_pair(a,b)
#define mst(a,b) memset(a,b,sizeof(a))
#define ON std::ios::sync_with_stdio(false);cin.tie(0)
#define Files() freopen("RNMTQ.in","r",stdin);freopen("RNMTQ.out","w",stdout)

using namespace std;

template<typename J>
I void fr(J &x)
{
    short f(1);
    x=0;
    char c(getchar());

    while(c<'0' or c>'9')
    {
        if(c=='-')
            f=-1;

        c=getchar();
    }

    while(c>='0' and c<='9') 
    {
        x=(x<<3)+(x<<1)+(c^=48);
        c=getchar();
    }

    x*=f;
}

template<typename J>
I void fw(J x,bool k)
{
    if(x<0)
        x=-x,putchar('-');

    static short stak[35];
    short top(0);

    do
    {
        stak[top++]=x%10;
        x/=10;
    }
    while(x);

    while(top)
        putchar(stak[--top]+'0');

    k?puts(""):putchar(' ');
}

template<typename J>
I J Hmin(const J &x,const J &y)
{
    Heriko x<y?x:y;
}

CI MXX(4e5+1);
const double INF(0x7fffffff);

struct Point
{
    double x,y;

    I bool operator < (const Point &co) const
    {
        Heriko (x==co.x)?(y<co.y):(x<co.x);
    }
}

a[MXX];

I bool CMP(int co,int ro)
{
    Heriko a[co].y<a[ro].y;
}

I double Dist(int co,int ro)
{
    double x((a[co].x-a[ro].x)*(a[co].x-a[ro].x));
    double y((a[co].y-a[ro].y)*(a[co].y-a[ro].y));

    Heriko sqrt(x+y);
}

int tmp[MXX];

double Merge(int l,int r)
{
    double dis(INF);

    if(l==r)
        Heriko dis;

    if(l+1==r)
        Heriko Dist(l,r);

    int mid((l+r)>>1);
    double dl(Merge(l,mid)),dr(Merge(mid+1,r));
    dis=Hmin(dl,dr);

    int top(0);

    for(int i(l);i<=r;++i)
        if(std::fabs(a[mid].x-a[i].x)<dis)
            tmp[++top]=i;

    std::sort(tmp+1,tmp+1+top,CMP);

    for(int i(1);i<=top;++i)
        for(int j(i+1);j<=top and (a[tmp[i]].y-a[tmp[i]].y)<dis;++j)
        {
            double dt(Dist(tmp[i],tmp[j]));
            dis=Hmin(dis,dt);
        }

    Heriko dis;
}

int n;

S main()
{
    // Files();

    fr(n);

    for(int i(1);i<=n;++i)
        scanf("%lf%lf",&a[i].x,&a[i].y);

    std::sort(a+1,a+1+n);
    double ans(Merge(1,n));
    printf("%.0lf\n",ans*ans);

    Heriko Deltana;
}

by HerikoDeltana @ 2022-01-07 20:04:45

后来,用 pair 重写了一遍,不知道为啥就好了。。

可能是这次写的巨大垃圾臭了。


|