Pagini recente » Cod sursa (job #1912166) | Cod sursa (job #1172099) | Cod sursa (job #338024) | Cod sursa (job #259183) | Cod sursa (job #1275243)
#include <fstream>
#include <vector>
#include <algorithm>
#include <cmath>
inline int dist(const std::pair<int, int> &a, const std::pair<int, int> &b)
{
return (a.first - b.first) * (a.first - b.first) + (a.second - b.second) * (a.second - b.second);
}
std::vector<std::pair<int, int> >read_data()
{
std::ifstream in("cmap.in");
int n, x, y;
std::vector<std::pair<int, int> > ret;
in >> n;
while (n--)
{
in >> x >> y;
ret.push_back(std::pair<int, int>(x, y));
}
in.close();
return ret;
}
void write_data(int sol)
{
std::ofstream out("cmap.out");
out << sqrt(sol) << '\n';
out.close();
}
int algo(const std::vector<std::pair<int, int> > &points, int left, int right)
{
if (right - left < 2)
return -1;
if (right - left == 2)
return dist(points[left], points[left + 1]);
int m = left + (right - left) / 2, dist1 = algo(points, left, m), dist2 = algo(points, m, right), d;
if (dist1 != -1 && dist2 != -1)
d = std::min(dist1, dist2);
else if (dist1 == -1 && dist2 == -1)
{
return std::min(std::min(dist(points[left], points[m]), dist(points[left], points[right - 1])), dist(points[m], points[right - 1]));
}
else
d = dist1 == -1 ? dist2 : dist1;
std::vector<std::pair<int, int> > tmp;
for (int i = left; i < right; i++)
if (i != m && dist(points[i], points[m]) < d)
tmp.push_back(points[i]);
for (int i = 0; i < (int) tmp.size(); i++)
for (int j = i + 1; j < std::min((int) tmp.size(), i + 8); j++)
d = std::min(d, dist(tmp[i], tmp[j]));
return d;
}
int main()
{
std::vector<std::pair<int, int> > points = read_data();
std::sort(points.begin(), points.end());
write_data(algo(points, 0, points.size()));
}