Pagini recente » Cod sursa (job #2560855) | Cod sursa (job #2229336) | Cod sursa (job #1904604) | Cod sursa (job #761588) | Cod sursa (job #2139281)
#include <bits/stdc++.h>
#define ll long long
#define inf 9e18
using namespace std;
ifstream fin("cmap.in");
ofstream fout("cmap.out");
struct point
{
int x, y;
};
point v[100001], v2[100001], v3[100001];
int n;
bool compare(point a, point b)
{
if (a.x < b.x)
return true;
if (a.x > b.x)
return false;
return true;
}
bool compare2(point a, point b)
{
if (a.y < b.y)
return true;
if (a.y > b.y)
return false;
return true;
}
long long dist(point a, point b)
{
return ((ll)a.x-(ll)b.x)*((ll)a.x-(ll)b.x)+((ll)a.y-(ll)b.y)*((ll)a.y-(ll)b.y);
}
long long solve(int lower, int upper)
{
if (lower == upper)
{
v2[lower] = v[lower];
return inf;
}
if (upper - lower == 1)
{
if (v[lower].y < v[upper].y)
{
v2[lower] = v[lower];
v2[upper] = v[upper];
}
else
{
v2[lower] = v[upper];
v2[upper] = v[lower];
}
return dist(v[lower], v[upper]);
}
/*if (upper - lower == 2)
{
long long res1 = dist(v[lower], v[lower+1]);
long long res2 = dist(v[lower], v[lower+2]);
if (res1 > res2)
res1 = res2;
res2 = dist(v[lower+1], v[lower+2]);
if (res1 > res2)
res1 = res2;
point p1, p2, p3, aux;
p1 = v[lower];
p2 = v[lower+1];
p3 = v[lower+2];
if (p1.y > p2.y)
{
aux = p1;
p1 = p2;
p2 = aux;
}
if (p1.y > p3.y)
{
aux = p1;
p1 = p3;
p3 = aux;
}
if (p2.y > p3.y)
{
aux = p2;
p2 = p3;
p3 = aux;
}
v2[lower] = p1; v2[lower+1] = p2; v2[lower+2] = p3;
return res1;
}*/
int mid = lower + (upper - lower) / 2, i, j;
long long res1 = solve(lower, mid);
long long res2 = solve(mid+1, upper);
if (res1 > res2)
res1 = res2;
i = lower; j = mid + 1;
double l = (double)v[mid].x + (v[mid+1].x - v[mid].x) / 2.0;
int aux_i = i, aux_j = mid+1, k = i;
while(aux_i <= mid && aux_j <= j)
{
if (v2[aux_i].y < v2[aux_j].y)
{
v3[k] = v2[aux_i];
k++;
aux_i++;
}
else if (v2[aux_i].y > v2[aux_j].y)
{
v3[k] = v2[aux_j];
k++;
aux_j++;
}
else
{
v3[k] = v2[aux_i];
v3[k+1] = v2[aux_j];
aux_i++;
aux_j++;
k = k + 2;
}
}
while (aux_i <= mid)
{
v3[k] = v2[aux_i];
k++;
aux_i++;
}
while (aux_j <= j)
{
v3[k] = v2[aux_j];
k++;
aux_j++;
}
for (int k = i; k <= j; k++)
v2[k] = v3[k];
//sort(v2 + i, v2 + j + 1, compare2);
int c = 0;
for (int k = i; k <= j; k++)
if (fabs((double)v2[k].x - l) <= res1)
{
c++;
v3[c] = v2[k];
}
for (int k = 1; k <= c; k++)
{
for (int l = 1; l <= 7; l++)
{
if (k + l <= c)
{
if (res1 > dist(v3[k], v3[k+l]))
res1 = dist(v3[k], v3[k+l]);
}
}
}
return res1;
}
int main()
{
int i;
fin >> n;
for (i = 1; i <= n; i++)
fin >> v[i].x >> v[i].y;
fin.close();
sort(v + 1, v + n + 1, compare);
long long res = solve(1, n);
fout << fixed << setprecision(6) << sqrt(res) << '\n';
fout.close();
return 0;
}