Cod sursa(job #1038141)

Utilizator cioionutFMI Ionut Ciocoiu cioionut Data 21 noiembrie 2013 00:30:59
Problema Cele mai apropiate puncte din plan Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include<iostream>
#include<fstream>
#include<math.h>
using namespace std;
long v[2][100001];
void xsort(long p,long u)
{
    long i=p,j=u,m,n;
    m=v[0][(i+j)/2];n=v[1][(i+j)/2];
    do
    {
        while(v[0][i]<m) i++;
        while(v[0][i]==m&&v[1][i]<n) i++;
        while(v[0][j]>m) j--;
        while(v[0][j]==m&&v[1][j]>n) j--;
        if(i<=j)
        {
            swap(v[0][i],v[0][j]);
            swap(v[1][i],v[1][j]);
            i++;j--;
        }
    }while(i<j);
    if(i<=u) xsort(i,u);
    if(p<=j) xsort(p,j);
}
void ysort(long p,long u)
{
    long i=p,j=u,m,n;
    n=v[0][(i+j)/2];m=v[1][(i+j)/2];
    do
    {
        while(v[1][i]<m) i++;
        while(v[1][i]==m&&v[0][i]<n) i++;
        while(v[1][j]>m) j--;
        while(v[1][j]==m&&v[0][j]>n) j--;
        if(i<=j)
        {
            swap(v[0][i],v[0][j]);
            swap(v[1][i],v[1][j]);
            i++;j--;
        }
    }while(i<j);
    if(i<=u) ysort(i,u);
    if(p<=j) ysort(p,j);
}
void divide(long p,long u,float &r)
{
    float r1,r2;
    if(u-p==1) r=sqrt(pow((v[0][p]-v[0][u]),2)+pow((v[1][p]-v[1][u]),2));
    //cout<<v[0][p]<<" "<<v[1][p]<<" - "<<v[0][u]<<" "<<v[1][u]<<"-->"<<r<<"\n";}
    else
        if(u-p>1)
    {
        int q=(p+u)/2;
        divide(p,q,r1);
        divide(q,u,r2);
        if (r1<r2) r=r1;
            else r=r2;
    }
}
int main()
{
    ifstream f("cmap.in");
    long i,n;float r,s;
    f>>n;
    for(i=1;i<=n;i++) f>>v[0][i]>>v[1][i];
    xsort(1,n);divide(1,n,r);
    //for(i=1;i<=n;i++) cout<<v[0][i]<<" "<<v[1][i]<<"\n";
    ysort(1,n);divide(1,n,s);
    //for(i=1;i<=n;i++) cout<<v[0][i]<<" "<<v[1][i]<<"\n";
    //if(r<s)cout<<r;else cout<<s;
    freopen("cmap.out", "w", stdout);
    if(r<s)printf("%.f",r);else printf("%.f",s);
    f.close();
    return 0;
}