findd函数模板,分治 #include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include<math.h> using namespace std; struct node1 { int x,y; }node[100010],node2[100010]; int cmpx(node1 p1,node1 p2) { return p1.x<p2.x; } int cmpy(node1 p1,node1 p2) { return p1.y<p2.y; } long long Distance(node1 p1,node1 p2) { return (p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y); } long long findd(int l,int r) { if(r==l+1) return Distance(node[l],node[r]); if(r==l+2) return min(Distance(node[l],node[l+1]),min(Distance(node[l+1],node[r]),Distance(node[l],node[r]))); int mid=l+(r-l)/2; long long ans=min(findd(l,mid),findd(mid+1,r)); int v=0; for(int i=l;i<=r;i++) { if(node[i].x>=node[mid].x-ans&&node[i].x<=node[mid].x+ans) node2[v++]=node[i]; } sort(node2,node2+v,cmpy); for(int i=0;i<v-1;i++) for(int j=i+1;j<v;j++) { if(node2[j].y-node2[i].y>=ans) break; else ans=min(ans,Distance(node2[i],node2[j])); } return ans; } int main() { int t; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d%d",&node[i].x,&node[i].y); } sort(node,node+n,cmpx); long long ans=0; ans=findd(0,n-1)*(n-2); ans+=findd(1,n-1); node[1]=node[0]; ans+=findd(1,n-1); printf("%lld\n",ans); } return 0; }
区间点集最短两点距离
最新推荐文章于 2025-06-06 21:53:37 发布