1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| #include <cstdio> #include <vector> #include <algorithm>
using namespace std;
struct Point { int x, y; };
int distance(Point& p, Point& q) { return (p.x - q.x) * (p.x - q.x) + (p.y - q.y) * (p.y - q.y); }
bool compare_x(Point& p, Point& q){ return (p.x < q.x); }
bool compare_y(Point& p, Point& q){ return (p.y < q.y); }
int findMin(vector<Point>::iterator it, int n){ if(n==2) return distance(it[0], it[1]); if(n==3) return min( {distance(it[0], it[1]), distance(it[1],it[2]), distance(it[2],it[0])});
int line = (it[n/2 - 1].x + it[n/2].x) / 2; int minDistance = min(findMin(it, n/2), findMin(it + n/2, n - n/2));
vector<Point> middle; middle.reserve(n);
for(int i = 0; i < n; i++){ int temp = line -it[i].x; if( temp * temp < minDistance) middle.push_back(it[i]); }
sort(middle.begin(), middle.end(), compare_y);
int size = middle.size(); for(int i = 0; i < size - 1; i++){ for(int j = i + 1; j < size && (middle[j].y - middle[i].y) * (middle[j].y - middle[i].y) < minDistance; j++) { minDistance = min(minDistance, distance(middle[i], middle[j])); } }
return minDistance;
}
int main() { int n; scanf("%d",&n);
vector<Point> vec(n); for(vector<Point>::iterator it = vec.begin(); it != vec.end(); it++) { scanf("%d %d", &it->x, &it->y); }
sort(vec.begin(), vec.end(), compare_x);
printf("%d\n", findMin(vec.begin(), n)); }
|