洛谷P3964松鼠聚会

题目

题意:求最小的从某一个点到其余点的切比雪夫距离和。

将一个图中的\((x,y)\)坐标转到新坐标\((x+y,x-y)\)后,图中的曼哈顿距离就是新图中的切比雪夫距离,

证明:分类讨论,

1.\(x2>x1,y2>y1时,x2-x1+y2-y1=x2+y2-(x1+y2)\)就是新坐标的X差。

2.\(x2>x1,y2<y1时,x2-x1+y1-y2=x2-y2-(x1-y1)\)就是新坐标的Y差。

其余情况加绝对值。

然后新图中的坐标\((X,Y)\)转回旧坐标后,有\(2x=X+Y,2y=X-Y\)

然后可以用曼哈顿距离求解。

易得:

\(i\)到各个节点的曼哈顿距离等于\(\sum_{k=1}^{k=n}~(x[k]-x[i])+\sum_{k=1}^{k=n}~(y[k]-y[i])\)在x,y数组递增的情况下。

先处理\(△x\)的情况,

原式=\(x[i]-x[1]+x[i]-x[2]...... + x[i]-x[i] + x[i+1]-x[i]+x[i+2]-x[i]......+x[n]-x[i]\)

​ =\(i*x[i]-Sum[i]-(n-i)*x[i]+Sum[n]-Sum[i]\)

\(△y\)同理。

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define int long long
using  namespace std;
int sumx[1010000], sumy[10010000];
int x[1001000], y[1001000];
int datax[1001000], datay[1001000];

int n, minn = 9223372036854775807;
signed main()
{
    scanf("%lld", &n);      
    for (int i = 1, x1, y1; i <= n; i++)
        scanf("%lld%lld", &x1, &y1), x[i] = datax[i] = x1 + y1, y[i] = datay[i] = x1 - y1;
    sort(datax + 1, datax + 1 + n); 
    sort(datay + 1, datay + 1 + n); 
    for (int i = 1; i <= n; i++)    
        sumx[i] = sumx[i - 1] + datax[i], sumy[i] = sumy[i - 1] + datay[i];
    for (int i = 1; i <= n; i++)
    {
        int ans = 0;
        int idx = lower_bound(datax + 1, datax + 1 + n, x[i]) - datax;
        int idy = lower_bound(datay + 1, datay + 1 + n, y[i]) - datay;
//      printf("%d %d\n", idx, idy);
        ans += idx * datax[idx] - sumx[idx] - (n - idx) * datax[idx] + sumx[n] - sumx[idx];
        ans += idy * datay[idy] - sumy[idy] - (n - idy) * datay[idy] + sumy[n] - sumy[idy];
        minn = min(minn, ans);
    }
    printf("%lld", minn / 2); 
    return 0;
}

转载于:https://www.cnblogs.com/liuwenyao/p/11107676.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值