144分求助
查看原帖
144分求助
937619
jsq1004楼主2023/10/13 15:31

rt,因未知原因答案多了一点,用的是分治。

#include<bits/stdc++.h>
#define x first
#define y second
#define int long long
using namespace std;
int n;
const int N = 4e5 + 5;
pair<int,int> a[N];
inline bool cmp(int p,int q){
  return (a[p].y == a[q].y)?a[p].x < a[q].x:a[p].y < a[q].y;
}
inline int dist(int p,int q){
  return (a[p].x - a[q].x) * (a[p].x - a[q].x) + (a[p].y - a[q].y) * (a[p].y - a[q].y);
}
inline int cdq(int l,int r){
  if (r - l == 1){
  	return dist(l,r);
  }
  if (r == l){
  	return 1e18;
  }
  int mid = (l + r) / 2;
  int d = min(cdq(l,mid),cdq(mid + 1,r));
  vector<int> v;
  for (int i = l;i <= r;i++){
  	if (abs(a[i].x - a[mid].x) * abs(a[i].x - a[mid].x) < d){
	  v.push_back(i);
    } 
  }
  sort(v.begin(),v.end(),cmp);
  for (int i = 0;i < v.size();i++){
  	for (int j = i + 1;j < v.size() && dist(v[i],v[j]) < d;j++){
  	  d = dist(v[i],v[j]);
	}
  }
  return d;
}
signed main(){
  ios::sync_with_stdio(0),cin.tie(0);
  cin >> n;
  for (int i = 0;i < n;i++){
  	cin >> a[i].x >> a[i].y;
  }
  sort(a,a + n);
  cout << cdq(0,n - 1);
  return 0;
} 
2023/10/13 15:31
加载中...