分析
平面最近点对板子题。虽然我是看了lyd大佬的标程才会的......所以代码和标程.......
代码
#include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define il inline #define re register #define tie0 cin.tie(0),cout.tie(0) #define fastio ios::sync_with_stdio(false) #define File(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout) using namespace std; typedef long long ll; typedef long double ld; template <typename T> inline void read(T &x) { T f = 1; x = 0; char c; for (c = getchar(); !isdigit(c); c = getchar()) if (c == '-') f = -1; for ( ; isdigit(c); c = getchar()) x = x * 10 + (c ^ 48); x *= f; } const double INF = 0x3f3f3f3f; const double eps = 1e-7; struct rd { int x, y; bool army; bool operator < (const rd &k) const { return x < k.x; } } ai[200005]; int n; double dis(rd a, rd b) { if (a.army == b.army) return INF; return sqrt((ld)(a.x - b.x) * (a.x - b.x) + (ld)(a.y - b.y) * (a.y - b.y)); } double raid(int l, int r) { if (l == r) return INF; if (r == l + 1) return dis(ai[l], ai[r]); int mid = l + r >> 1; double ans = min(raid(l, mid), raid(mid, r)); for (int i = mid - 1; i >= l; --i) { if (ai[mid].x - ai[i].x + eps > ans) break; for (int j = mid + 1; j <= r; ++j) { if (ai[j].x - ai[i].x + eps > ans) break; ans = min(ans, dis(ai[i], ai[j])); } } return ans; } void solve() { read(n); for (int i = 1; i <= n; ++i) { read(ai[i].x), read(ai[i].y); ai[i].army = 0; } for (int i = 1; i <= n; ++i) { read(ai[i+n].x), read(ai[i+n].y); ai[i+n].army = 1; } sort(ai + 1, ai + 1 + n * 2); printf("%.3f\n", raid(1, 2 * n)); } int main() { int t; read(t); while (t--) solve(); return 0; }