您的位置:首页 > 其它

HDU 4312 最小切比雪夫距离-转化成曼哈顿距离再分治

2015-08-03 18:10 369 查看
题意:二维空间,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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: