求调,分治+归并
查看原帖
求调,分治+归并
1090042
lyx0813楼主2025/8/5 08:26
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;

int n;
struct node {
    long long x, y;
} a[500100], b[500100];

bool cmp(node x, node y) {
    return x.x < y.x;
}
bool cmp2(node x,node y){
    return x.y<y.y;
}
double lenab(node x, node y) {
    return abs(x.x - y.x) + abs(x.y - y.y) ;
}

vector<node> pai;

double solve(int l, int r) {
    if (l >= r) {
        return 1e18;
    }
    if (r - l + 1 == 2) {
        if (a[l].y > a[r].y) {
            swap(a[l], a[r]);
        }
        return lenab(a[l], a[r]);
    }

    long long mid = (l + r) >> 1;
    long long mid_x = a[mid].x;
    double ans = min(solve(l, mid), solve(mid + 1, r));

    // int i = l, j = mid + 1, k = l;
    // while (i <= mid && j <= r) {
    //     if (a[i].y < a[j].y) {
    //         b[k++] = a[i++];
    //     } else {
    //         b[k++] = a[j++];
    //     }
    // }
    // while (i <= mid) {
    //     b[k++] = a[i++];
    // }
    // while (j <= r) {
    //     b[k++] = a[j++];
    // }
    // for (int idx = l; idx <= r; idx++) {
    //     a[idx] = b[idx];
    // }
    inplace_merge(a+l,a+mid+1,a+r+1,cmp2);
    pai.clear();
    for (size_t idx = l; idx <= r; idx++) {
        if (fabs((double)a[idx].x - mid_x) <= ans) {
            pai.push_back(a[idx]);
        }
    }

    size_t sz = pai.size();
    for (size_t i = 0; i < sz; i++) {
        for (size_t j = i + 1; j < sz; j++) {
            if ((double)(pai[j].y - pai[i].y) > ans) 
                break;
            ans = min(ans, lenab(pai[i], pai[j]));
        }
    }
    return ans;
}

int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i].x >> a[i].y;
    }
    sort(a+1, a+n+1, cmp);
    printf("%.0lf\n", solve(1, n));
    return 0;
}
2025/8/5 08:26
加载中...