#include #include #include #include #include using namespace std; const int maxn = 200010; int n, d[maxn], lc[maxn], rc[maxn]; double ans = 2e18; struct node { double x, y; } s[maxn]; double L[maxn], R[maxn], D[maxn], U[maxn]; double dist(int a, int b) { return (s[a].x - s[b].x) * (s[a].x - s[b].x) + (s[a].y - s[b].y) * (s[a].y - s[b].y); } bool cmp1(node a, node b) { return a.x < b.x; } bool cmp2(node a, node b) { return a.y < b.y; } void maintain(int x) { L[x] = R[x] = s[x].x; D[x] = U[x] = s[x].y; if (lc[x]) L[x] = min(L[x], L[lc[x]]), R[x] = max(R[x], R[lc[x]]), D[x] = min(D[x], D[lc[x]]), U[x] = max(U[x], U[lc[x]]); if (rc[x]) L[x] = min(L[x], L[rc[x]]), R[x] = max(R[x], R[rc[x]]), D[x] = min(D[x], D[rc[x]]), U[x] = max(U[x], U[rc[x]]); } int build(int l, int r) { if (l >= r) return 0; int mid = (l + r) >> 1; double avx = 0, avy = 0, vax = 0, vay = 0; // average variance for (int i = l; i <= r; i++) avx += s[i].x, avy += s[i].y; avx /= (double)(r - l + 1); avy /= (double)(r - l + 1); for (int i = l; i <= r; i++) vax += (s[i].x - avx) * (s[i].x - avx), vay += (s[i].y - avy) * (s[i].y - avy); if (vax >= vay) d[mid] = 1, nth_element(s + l, s + mid, s + r + 1, cmp1); else d[mid] = 2, nth_element(s + l, s + mid, s + r + 1, cmp2); lc[mid] = build(l, mid - 1), rc[mid] = build(mid + 1, r); maintain(mid); return mid; } double f(int a, int b) { double ret = 0; if (L[b] > s[a].x) ret += (L[b] - s[a].x) * (L[b] - s[a].x); if (R[b] < s[a].x) ret += (s[a].x - R[b]) * (s[a].x - R[b]); if (D[b] > s[a].y) ret += (D[b] - s[a].y) * (D[b] - s[a].y); if (U[b] < s[a].y) ret += (s[a].y - U[b]) * (s[a].y - U[b]); return ret; } void query(int l, int r, int x) { if (l > r) return; int mid = (l + r) >> 1; if (mid != x) ans = min(ans, dist(x, mid)); if (l == r) return; double distl = f(x, lc[mid]), distr = f(x, rc[mid]); if (distl < ans && distr < ans) { if (distl < distr) { query(l, mid - 1, x); if (distr < ans) query(mid + 1, r, x); } else { query(mid + 1, r, x); if (distl < ans) query(l, mid - 1, x); } } else { if (distl < ans) query(l, mid - 1, x); if (distr < ans) query(mid + 1, r, x); } } int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%lf%lf", &s[i].x, &s[i].y); build(1, n); for (int i = 1; i <= n; i++) query(1, n, i); printf("%.4lf\n", sqrt(ans)); return 0; }