最近点对的算法还是比较清楚的,在实际代码阶段要让效率达到最高,需要先对x排好序,递归过程中保证不再更改(因为x只用于分割这一步)。之后对y的排序要融合归并排序进去,即把元素分割到1个,这样保证排好序。之后在合并步骤只要合并两个排序好的数组,O(N)即可解决。
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
typedef tuple<double, double> P;
int INF = 1 << 30;
bool cmp_y(P a, P b)
{
return get<1>(a) < get<1>(b);
}
double calculate_dist(P a, P b)
{
double x = get<0>(a) - get<0>(b);
double y = get<1>(a) - get<1>(b);
return sqrt(x * x + y * y);
}
// 调用时,横坐标都是排好序的
double min_dist(vector<P>& v, int l, int r)
{
if (l == r)return INF;
int mid = l + (r - l) / 2;
double d = min(min_dist(v, l, mid), min_dist(v, mid + 1, r));
double mid_x = get<0>(v[mid]