【bzoj 3210】花神的浇花集会(切比雪夫距离)

传送门biu~
曼哈顿距离转切比雪夫距离公式:
||x1x2|+|y1y2|=max{|(x1+y1)(x2+y2)|,|(x1y1)(x2y2)|} | | x 1 − x 2 | + | y 1 − y 2 | = max { | ( x 1 + y 1 ) − ( x 2 + y 2 ) | , | ( x 1 − y 1 ) − ( x 2 − y 2 ) | } 的逆用。把每个点的坐标(x,y)转化为(x+y,x-y)。那么题目中的切比雪夫距离就转化为了曼哈顿距离。对于新图分别求x,y坐标的中位数即为答案坐标。
如果求出的答案坐标x和y的奇偶性不同,说明这个答案在转化前不是整点,那么在这个点周围四个位置找最小答案即可。

#include<bits/stdc++.h>
#define N 100005
using namespace std;
int n,X[N],Y[N],xx[]={1,-1,0,0},yy[]={0,0,1,-1};
long long sum,ans;
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
        int x,y;
        scanf("%d%d",&x,&y);
        X[i]=x+y;
        Y[i]=x-y;
    }
    sort(X+1,X+n+1);sort(Y+1,Y+n+1);
    int ax=X[n+1>>1],ay=Y[n+1>>1];ans=0;
    if((ax&1)==(ay&1)){
        for(int i=1;i<=n;++i)
            ans+=abs(ax-X[i])+abs(ay-Y[i]);
        printf("%lld\n",ans>>1);
    }
    else{
        for(int i=0;i<4;++i){
            sum=0;
            int nx=ax+xx[i];
            int ny=ay+yy[i];
            for(int i=1;i<=n;++i)
                sum+=abs(nx-X[i])+abs(ny-Y[i]);
            if(!ans || sum<ans) ans=sum;
        }
        printf("%lld\n",ans>>1);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zP1nG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值