BZOJ_3170_[Tjoi2013]松鼠聚会_切比雪夫距离
2018-02-21 22:21
239 查看
BZOJ_3170_[Tjoi2013]松鼠聚会_切比雪夫距离
题意:有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点,距离为1。现在N个松鼠要走到一个松鼠家去,求走过的最短距离。
分析:
这啥奇怪的距离表示啊。推了一下发现是max{ abs(x[i] - x[j]),abs(y[i] - y[j] }。然后就不会了。
看题姐:这个东西叫切比雪夫距离,可以和曼哈顿距离转化。
把坐标变成(x[i]-y[i])/2,(x[i]+y[i])/2,求一遍曼哈顿距离,展开再分类讨论一下发现和上面那个式子是等价的。
曼哈顿距离就好办了。可以对x轴y轴分别求前缀和。
快速求出任意一点到其他所有点的距离:
x[i]*(i-1)-s[i-1]+s -s[i]-(n-i)*x[i](s为前缀和。)
代码:
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; #define N 100050 #define LL long long struct A{ int id,x,y; }a ; int n; LL xx ,yy ,ans,s ; bool cmp1(const A &g,const A &h){ return g.x<h.x; } bool cmp2(const A &g,const A &h){ return g.y<h.y; } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ a[i].id=i; scanf("%d%d",&a[i].x,&a[i].y); int tmp=a[i].x; a[i].x=a[i].x+a[i].y; a[i].y=tmp-a[i].y; } sort(a+1,a+n+1,cmp1); for(int i=1;i<=n;i++){ s[i]=s[i-1]+a[i].x; } for(int i=1;i<=n;i++){ xx[a[i].id]=1ll*a[i].x*(i-1)-s[i-1]+s -s[i]-1ll*(n-i)*a[i].x; } sort(a+1,a+n+1,cmp2); for(int i=1;i<=n;i++){ s[i]=s[i-1]+a[i].y; } LL ans=1ll<<60; for(int i=1;i<=n;i++){ yy[a[i].id]=1ll*a[i].y*(i-1)-s[i-1]+s -s[i]-1ll*(n-i)*a[i].y; ans=min(ans,xx[a[i].id]+yy[a[i].id]); } printf("%lld\n",ans>>1); }
相关文章推荐
- BZOJ 3170: [Tjoi 2013]松鼠聚会(切比雪夫距离)
- BZOJ 3170: [Tjoi 2013]松鼠聚会 切比雪夫距离
- BZOJ 3170 TJOI 2013 松鼠聚会 切比雪夫距离
- BZOJ 3170 [Tjoi 2013]松鼠聚会 切比雪夫距离-->曼哈顿距离
- bzoj 3170 Tjoi 2013 松鼠聚会 曼哈顿距离&&切比雪夫距离
- BZOJ 3170: [Tjoi 2013]松鼠聚会 切比雪夫距离
- bzoj3170 [Tjoi 2013]松鼠聚会
- [BZOJ 3170][Tjoi 2013]松鼠聚会
- bzoj 3170: [Tjoi 2013]松鼠聚会
- 【BZOJ3170】[Tjoi 2013]松鼠聚会 旋转坐标系
- 【bzoj3170】[Tjoi 2013]松鼠聚会 旋转坐标系
- [BZOJ3170] [Tjoi 2013]松鼠聚会
- bzoj3170 [Tjoi2013]松鼠聚会(转换坐标系)
- BZOJ 3170 [Tjoi 2013]松鼠聚会
- BZOJ3170[TJOI2013]松鼠聚会
- BZOJ3170: [Tjoi 2013]松鼠聚会
- bzoj3170【TJOI2013】松鼠聚会
- bzoj 3170: [Tjoi 2013]松鼠聚会 计算几何
- BZOJ 3170 Tjoi 2013 松鼠聚会 计算几何
- BZOJ 3170([Tjoi 2013]松鼠聚会-Manhattan距离单点最近)