1. 程式人生 > 其它 >Part2.4 P1429 平面最近點對【平面分治】

Part2.4 P1429 平面最近點對【平面分治】

原題連結:P1429 平面最近點對(加強版) - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)

題意:給定平面上 n 個點,找出其中的一對點的距離,使得在這 n 個點的所有點對中,該距離為所有點對中最小的

思路:平面分治,每次處理兩邊,再計算跨區間點對距離,貼一個優質題解(42條訊息) 分治入門——平面分治_zhang_ab的部落格-CSDN部落格_平面分治

評價:基本分治考察

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 //#define mod 1000000007
 4 #define inf 0x3f3f3f3f
 5
typedef long long ll; 6 struct node 7 { 8 double x,y; 9 }a[200005]; 10 bool cmp(struct node e1,struct node e2) 11 { 12 return e1.x<e2.x; 13 } 14 double dis(struct node e1,struct node e2) 15 { 16 return sqrt((e1.x-e2.x)*(e1.x-e2.x)+(e1.y-e2.y)*(e1.y-e2.y)); 17 } 18 double solve(int l,int
r) 19 { 20 if(l==r) return inf; 21 if(l+1==r) return dis(a[l],a[r]); 22 int mid=(l+r)/2; 23 double st=a[mid].x; 24 double d=min(solve(l,mid),solve(mid+1,r)); 25 for(int i=mid;i>=l&&st-a[i].x<d;i--) 26 for(int j=mid+1;j<=r&&a[j].x-st<d;j++) 27
d=min(d,dis(a[i],a[j])); 28 return d; 29 } 30 int main() 31 { 32 int n; 33 scanf("%d",&n); 34 for(int i=1;i<=n;i++) scanf("%lf%lf",&a[i].x,&a[i].y); 35 sort(a+1,a+1+n,cmp); 36 double ans =solve(1,n); 37 printf("%.4f",ans); 38 }