码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-08-03 19:11:06      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:hdu

题意:二维空间,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;
	}
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

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

标签:hdu

原文地址:http://blog.csdn.net/ac_0_summer/article/details/47259831

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!