Mai intai trebuie sa te autentifici.
Cod sursa(job #2073992)
Utilizator | Data | 23 noiembrie 2017 22:40:41 | |
---|---|---|---|
Problema | Cele mai apropiate puncte din plan | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 3.03 kb |
#include <iostream>
#include <fstream>
#include <vector>
#include <math.h>
#include <algorithm>
#include<bits/stdc++.h>
using namespace std;
typedef long long int llint;
bool sortbysec(const pair<llint,llint> &a, const pair<llint,llint> &b){
return (a.second < b.second);
}
long double distEuclid(pair<llint, llint> p1, pair<llint, llint> p2){
return sqrt(pow(p1.first-p2.first,2) + pow(p1.second-p2.second,2));
}
void llinterclaseaza(vector< pair<llint, llint> > Y, llint st, llint mij, llint dr){
vector< pair<llint, llint> > Z;
llint i = st, j = mij+1;
while (i <= mij && j <= dr){
if (Y[i].second <= Y[j].second){
Z.push_back(Y[i]);
i++;
}
else{
Z.push_back(Y[j]);
j++;
}
while(i <= mij){
Z.push_back(Y[i]);
i++;
}
while(j <= dr){
Z.push_back(Y[j]);
j++;
}
for (llint i=st; i<=dr; i++)
Y[i] = Z[i-st];
}
}
long double DivImp(vector< pair<llint, llint> > X, vector< pair<llint, llint> > Y, llint st, llint dr){
if (dr - st + 1 < 4){
sort(Y.begin(), Y.end(), sortbysec);
long double minVal = distEuclid(X[st], X[dr]);
for (llint i=st; i<=dr-1; i++)
for (llint j=i+1; j<=dr; j++){
if (distEuclid(X[i], X[j]) < minVal)
minVal = distEuclid(X[i], X[j]);
}
return minVal;
}
else{
llint mij = (st + dr)/2;
long double d1 = DivImp(X, Y, st, mij);
long double d2 = DivImp(X, Y, mij+1, dr);
long double d = min(d1, d2);
llinterclaseaza(Y, st, mij, dr);
vector< pair<llint, llint> > LY;
for (llint i=st; i<=dr; i++){
if (abs(Y[i].first - X[mij].first) <= d)
LY.push_back(Y[i]);
}
llint nr;
long double d3 = d;
for (llint i=0; i<LY.size()-1; i++){
if (7 <= LY.size()-i)
nr = 7;
else nr = LY.size()-i;
for (llint j=1; j<=nr; j++){
if(distEuclid(LY[i], LY[i+j]) < d3)
d3 = distEuclid(LY[i], LY[i+j]);
}
}
return d3;
}
}
int main()
{
fstream InputFile;
ofstream OutputFile;
llint n;
pair<llint, llint> p;
vector< pair<llint, llint> > X;
vector< pair<llint, llint> > Y;
InputFile.open("cmap.in");
if (InputFile.is_open()){
InputFile >> n;
for (llint i=0; i<n; i++){
InputFile >> p.first;
InputFile >> p.second;
X.push_back(p);
}
InputFile.close();
}
else cout << "The input file could not be opened.";
sort(X.begin(), X.end());
for (llint i=0; i<X.size(); i++){
Y.push_back(X[i]);
cout << Y[i].first << " " << Y[i].second << endl;
}
OutputFile.open("cmap.out");
OutputFile << DivImp(X, Y, 0, n-1);
return 0;
}