141pts 求调

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

Fractured_Angel @ 2024-01-23 21:10:31

既有WA又有TLE,不知道为啥

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <iomanip>
using namespace std;
typedef long long LL;
inline int Read()
{
    int f = 1, x = 0;
    char ch = getchar();
    while(ch < '0' || ch > '9')
    {
        if(ch == '-') f = -1;
        ch = getchar();
    }
    while('0' <= ch && ch <= '9')
    {
        x = x * 10;
        x += ch - '0';
        ch = getchar();
    }
    return x * f;
}
const int MAXN = 1000005;
const LL INF = 1e17;
int n;
struct Point
{
    int x, y;
} P[MAXN], T[MAXN], Q[MAXN];
bool cmp(Point p, Point q)
{
    return p.x < q.x;
}
bool cmp2(Point p, Point q)
{
    return p.y < q.y;
}
LL dist(LL sx, LL sy, LL ex, LL ey)
{
    return (sx - ex) * (sx - ex) + (sy - ey) * (sy - ey);
}
LL Solve(int l, int r)
{
    if(l == r) return INF;
    int mid = (l + r) >> 1;
    LL d = min(Solve(l, mid), Solve(mid + 1, r));
    int ggg = P[mid].x;
    int i2 = l, j2 = mid + 1;
    int pos = l - 1;
    while(i2 <= mid || j2 <= r)
    {
        if(i2 > mid)
        {
            Q[++ pos] = P[j2];
            j2 ++;
            continue;
        }
        if(j2 > r)
        {
            Q[++ pos] = P[i2];
            i2 ++;
            continue;
        }
        if(P[i2].y <= P[j2].y)
        {
            Q[++ pos] = P[i2];
            i2 ++;
        }
        else
        {
            Q[++ pos] = P[j2];
            j2 ++;
        }
    }
    for(int i = l; i <= r; i ++) P[i] = Q[i];
    int tot = 0;
    for(int i = l; i <= r; i ++)
        if((P[i].x - ggg) * (P[i].x - ggg) < d) T[++ tot] = P[i];
    for(int i = 1; i <= tot; i ++)
        for(int j = i + 1; j <= tot && (T[j].y - T[i].y) * (T[j].y - T[i].y) < d; j ++)
            d = min(d, dist(T[i].x, T[i].y, T[j].x, T[j].y));
    return d;
}
int main()
{
    n = Read();
    for(LL i = 1; i <= n; i ++) 
    {
        P[i].x = Read(); 
        P[i].y = Read();
    }
    sort(P + 1, P + n + 1, cmp);
    printf("%lld\n", Solve(1, n));
    return 0;
}

|