1. 程式人生 > 實用技巧 >研究生演算法 2-4 YY and Point

研究生演算法 2-4 YY and Point

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define INF 9223372036854775807LL

struct point {
	int x, y;
	point(int x, int y): x(x), y(y) {};
	bool operator <(point obj) {
		return y < obj.y;
	}
};
int n;
vector <point> input;

ll dis(point a, point b) {
	return pow(a.x - b.x, 2) + pow(a.y - b.y, 2);
}

ll solve(int l, int r) {
	if (l == r) {
		return INF;
	}
	
	int mid = (l + r) >> 1;
	ll d = min(solve(l, mid), solve(mid + 1, r));
	
	vector <point> v;
	for (int i = l; i <= r; i++) {
		if (dis(input[mid], input[i]) < d) {
			v.push_back(input[i]);
		}
	}

	for (int i = 0; i < v.size(); i++) {
		for (int j = i + 1; j < v.size(); j++) {
			d = min(d, dis(v[i], v[j]));
		}
	}
	
	return d;
}

int main() {
	cin >> n;
	for (int i = 0; i < n; i++) {
		int x, y;
		cin >> x >> y;
		input.push_back(point(abs(x), abs(y)));
	}
	sort(input.begin(), input.end());
	
	cout << solve(0, n - 1) << endl;
}