HDU 4311 Contest 2

求的是曼哈顿距离。可以把X,Y的距离分开来求。其中,求X、Y的距离可以通过排序后递推的方式求出值的。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#define LL __int64
using namespace std;

struct point{
	int x,y;
	int num;
}acm[100005];
int n;

bool cmpx(point a, point b){
	if(a.x<b.x) return true;
	return false;
}
bool cmpy(point a,point b){
	if(a.y<b.y) return true;
	return false;
}

LL distx[100005],disty[100005];

LL mint(LL a,LL b){
	if(a<b) return a;
	return b;
}

void init(){
	for(int i=0;i<n;i++)
	distx[i]=disty[i]=0;
}

int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		scanf("%d",&n);
		init();
		for(int i=0;i<n;i++){
			scanf("%d%d",&acm[i].x,&acm[i].y);
			acm[i].num=i;
		}
		LL tmp;
		sort(acm,acm+n,cmpx);
		tmp=0;
		for(int i=0;i<n;i++){
			if(!i)
				tmp=distx[acm[i].num]=0;
			else{
				distx[acm[i].num]=tmp=tmp+(LL)i*((LL)acm[i].x-(LL)acm[i-1].x);
			}
		}
		tmp=0;
		for(int i=n-1;i>=0;i--){
			if(i==n-1){
				tmp=0;
				distx[acm[i].num]+=tmp;
			}
			else {
				tmp=tmp+(LL)(n-1-i)*((LL)acm[i+1].x-(LL)acm[i].x);
				distx[acm[i].num]+=tmp;
			}
		}
		sort(acm,acm+n,cmpy);
		for(int i=0;i<n;i++){
			if(!i)
			disty[acm[i].num]=tmp=0;
			else{
				disty[acm[i].num]=tmp=tmp+(LL)i*((LL)acm[i].y-(LL)acm[i-1].y);
			}
		}
		for(int i=n-1;i>=0;i--){
			if(i==n-1){
				tmp=0;
				disty[acm[i].num]+=tmp;
			}
			else {
				tmp=tmp+(LL)(n-1-i)*((LL)acm[i+1].y-(LL)acm[i].y);
				disty[acm[i].num]+=tmp;
			}
		}
		LL ans=distx[0]+disty[0];
		for(int i=1;i<n;i++)
		ans=mint(ans,distx[i]+disty[i]);
		printf("%I64d
",ans);
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/jie-dcai/p/4059668.html