题意:二维空间,n个点,求以某点为起点到各点的最小切比雪夫距离
分析:
上一道题之前已经用“分治“思想在O(n)的时间内求出了n个点,以某点为起点到各点的最小曼哈顿距离,那么我们根据二维空间切比雪夫距离和曼哈顿距离的关系,可以把切比雪夫距离转化成曼哈顿距离,再直接用之前的方法即可。
二维空间:
曼哈顿距离 :d=|x1-x2|+|y1-y2|,到某点的曼哈顿距离为r的点组成一个边长为√2*r的正方形,且边与坐标轴成45度
切比雪夫距离:d=max(|x1-x2|,|y1-y2|),到某点的切比雪夫距离为r的点组成一个边长为2*r的正方形,且边与坐标轴平行
在二维平面我们可以发现边长为r的切比雪夫正方形旋转45度,就变成了边长为2*r的曼哈顿正方形,旋转公式是:x‘=x+y,y‘=y-x。所以我们只需在上面一题的代码中加上这个坐标转化,结果输出ans/2就行了
代码:
#include<iostream> #include<cstring> #include<algorithm> #define INF 1000000000000007 using namespace std; struct node{ long long x,y; long long sum; }a[100005]; bool cmp1(node a,node b) { return a.x<b.x; } bool cmp2(node a,node b) { return a.y<b.y; } int main(){ int t,n; cin>>t; while(t--){ cin>>n; long long ans=INF; memset(a,0,sizeof(0)); for(int i=0;i<n;i++){ cin>>a[i].x>>a[i].y; long long tmp=a[i].x; a[i].x+=a[i].y; a[i].y-=tmp; } sort(a,a+n,cmp1); long long sum=0; for(int i=0;i<n;i++){ a[i].sum=i*a[i].x-sum; sum+=a[i].x; } sum=0; for(int i=n-1;i>=0;i--){ a[i].sum+=sum-(n-1-i)*a[i].x; sum+=a[i].x; } sort(a,a+n,cmp2); sum=0; for(int i=0;i<n;i++){ a[i].sum+=i*a[i].y-sum; sum+=a[i].y; } sum=0; for(int i=n-1;i>=0;i--){ a[i].sum+=sum-(n-1-i)*a[i].y; sum+=a[i].y; ans=min(ans,a[i].sum); } cout<<ans/2<<endl; } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-04 19:14:55