您的位置:首页 > 其它

bzoj 3170 Tjoi 2013 松鼠聚会 曼哈顿距离&&切比雪夫距离

2017-03-06 17:01 489 查看
  因为曼哈顿距离很好求,所以要把每个点的坐标转换一下。

  转自:http://blog.csdn.net/slongle_amazing/article/details/50911504

  题解

  

两个点的切比雪夫距离为d=max(|x1−x2|,|y1−y2|)
  写一下曼哈顿距离的常用处理方法
  两个点(x1,y2),(x2,y2)

  其曼哈顿距离=|x1−x2|+|y1−y2|
  因为|x1−x2|=max(x1−x2,x2−x1)
  所以可以写成=max(x1−x2+y1−y2,x1−x2+y2−y1,x2−x1+y1−y2,x2−x1+y2−y1)

  =max((x1+y1)−(x2+y2),(x1−y1)−(x2−y2),−(x1−y1)+(x2−y2),−(x1+y1)+(x2+y2))

  =max(|(x1+y1)−(x2+y2)|,|(x1−y1)−(x2−y2)|)

  令x′=x+y,y′=x−y=max(|x′1−x′2|,|y′1−y′2|)

  这样曼哈顿距离就被转化为了切比雪夫距离
  同理,我们把切比雪夫距离转化为曼哈顿距离(x,y)=((x+y)/2,(x−y)/2)
  就转化为了n−1个点到一个点的曼哈顿距离最小
  计算曼哈顿距离x和y分开计算即可

  

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define ll long long
#define N 100005
using namespace std;
int n;
struct node
{
int x,y,id;
friend bool operator < (node aa,node bb)
{
return aa.x<bb.x;
}
}a[100005];
ll ans
,sum
;
bool cmp(node aa,node bb)
{
return aa.y<bb.y;
}
int main()
{
scanf("%d",&n);int t1,t2;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&t1,&t2);
a[i].x=t1+t2;a[i].y=t1-t2;a[i].id=i;
}
sort(a+1,a+n+1);
for(int i=1;i<=n;i++)sum[i]=sum[i-1]+a[i].x;
for(int i=1;i<=n;i++)
{
ans[a[i].id]+=(ll)a[i].x*(i-1)-sum[i-1];
ans[a[i].id]+=(sum
-sum[i])-((ll)a[i].x*(n-i));
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)sum[i]=sum[i-1]+a[i].y;
for(int i=1;i<=n;i++)
{
ans[a[i].id]+=(ll)a[i].y*(i-1)-sum[i-1];
ans[a[i].id]+=(sum
-sum[i])-((ll)a[i].y*(n-i));
}
ll mx=1ll<<62;
for(int i=1;i<=n;i++)mx=min(mx,ans[i]);
printf("%lld\n",mx/2);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: