113求助qwq
查看原帖
113求助qwq
745892
xiongyuhan楼主2024/1/23 22:02
#include<bits/stdc++.h>

#define int long long

using namespace std;

const int Kmaxn = 1e6 + 5;

int n;
struct node{
	int x, y;
}a[Kmaxn], t[Kmaxn], b[Kmaxn];
int dis(int x1, int y11, int x2, int y2){
	return (x1 - x2) * (x1 - x2) + (y11 - y2) * (y11 - y2);
}
bool cmp1(node a, node b){
	return a.x < b.x;
}
void merge(int l, int r){
	int mid = (l + r) / 2;
	int i = l, j = mid + 1, tot = l - 1;
	while(i <= mid && j <= r){
		if(a[i].y <= a[j].y){
			b[++tot] = a[i];
			i++;
		}
		else{
			b[++tot] = a[j];
			j++;
		}
	}
	while(i <= mid) b[++tot] = a[i], i++;
	while(j <= r) b[++tot] = a[j], j++;
	for(int k = l ; k <= r ; k++) a[k] = b[k];
}
int solve(int l, int r){
	if(l == r) return 2e15;
	int mid = (l + r) / 2, tot = 0, d = min(solve(l, mid), solve(mid + 1, r));
	int v = a[mid].x;
	merge(l, r);
	for(int i = l ; i <= r ; i++){
		if(abs(a[i].x - v) * abs(a[i].x - v) < d) t[++tot] = a[i];
	}
	for(int i = 1 ; i < tot ; i++){
		for(int j = i + 1 ; j <= tot ; j++){
			if((t[j].y - t[i].y) * (t[j].y - t[i].y) >= d) break;
			d = min(d, dis(t[i].x, t[i].y, t[j].x, t[j].y));
		}
	}
	return d;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> n;
	for(int i = 1 ; i <= n ; i++) cin >> a[i].x >> a[i].y;
	sort(a + 1, a + n + 1, cmp1);
	cout << solve(1, n);
	return 0;
}
2024/1/23 22:02
加载中...