Pagini recente » Cod sursa (job #2061396) | Cod sursa (job #1883865) | Cod sursa (job #2098676) | Cod sursa (job #794198) | Cod sursa (job #2240081)
#include <fstream>
#include <algorithm>
#include <deque>
#include <cmath>
#include <iomanip>
#define x first
#define y second
using namespace std;
ifstream fin ("cmap.in");
ofstream fout("cmap.out");
deque<int> Y;
int n,i;
pair<int,int> v[100001];
int cmp(int a, int b)
{
if(v[a].y<v[b].y)
return a<b;
else
return b<a;
}
double dist(int i, int j)
{
return sqrt((v[i].x-v[j].x)*(v[i].x-v[j].x)+(v[i].y-v[j].y)*(v[i].y-v[j].y));
}
double solve(int st, int dr)
{
int i,j,mid;
double mini=2000000000,aux;
if(dr-st+1<=3)
{
for(i=st;i<dr;i++)
for(j=i+1;j<=dr;j++)
{
aux=dist(i, j);
if(mini>aux)
mini=aux;
}
return mini;
}
mid=(st+dr)/2;
mini=min(solve(st, mid), solve(mid+1, dr));
for(i=mid;v[mid].x-v[i].x<=mini&&i>=st;i--)
Y.push_back(i);
for(i=mid+1;v[i].x-v[mid].x<=mini&&i<=dr;i++)
Y.push_back(i);
sort(Y.begin(), Y.end(),cmp);
while(Y.size())
{
for(i=1;i<=7&&i<Y.size();i++)
{
aux=dist(Y[0], Y[i]);
if(mini>aux)
mini=aux;
}
Y.pop_front();
}
return mini;
}
int main(){
fin>>n;
for(i=1;i<=n;i++)
fin>>v[i].x>>v[i].y;
sort(v+1, v+n+1);
fout<<setprecision(6)<<fixed<<solve(1, n);
return 0;
}