其他分享
首页 > 其他分享> > 切雪比夫距离

切雪比夫距离

作者:互联网

[TJOI2013]松鼠聚会

两个点 \((x_1,y_1),(x_2,y_2)\) 的切雪比夫距离为:\(\max(|x_1-x_2|,|y_1-y_2|)\)。

这个东西非常不好处理,因为带最值。

学习了转换切雪比夫距离和曼哈顿距离的方法,而曼哈顿距离和是很好求的。

转换公式为 \((x,y)\to (x+y,x-y)\),即可将曼哈顿距离转换为切比雪夫距离。

\[|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|) \]

右边那个可以化成:

\[\max(|(x_1-x_2)+(y_1-y_2)|,|(x_1-x_2)-(y_1-y_2)|) \]

会发现这个东西和左边等价。

于是,证明成立。

那么返回去倒退即可得到:

切雪比夫转换为曼哈顿:\((x,y)\to (\frac{x+y}{2},\frac{x-y}{2})\)。

于是此题便可以得以解决。

#include <stdio.h>
#include <algorithm>
#define LL long long
using namespace std;
const int N=1e5+3;
inline LL min(LL x,LL y){return x<y?x:y;}
inline LL rin()
{
    LL s=0;
    bool bj=false;
    char c=getchar();
    for(;(c>'9'||c<'0')&&c!='-';c=getchar());
    if(c=='-')bj=true,c=getchar();
    for(;c>='0'&&c<='9';c=getchar())s=(s<<1)+(s<<3)+(c^'0');
    if(bj)s=-s;
    return s;
}

LL s_x;
LL s_y;
struct gyq
{
    LL x,y;
    LL sum;
    inline void init()
    {
        int x_=rin(),y_=rin();
        x=x_+y_;y=x_-y_;
        s_x+=x;s_y+=y;
        return;
    }
}a[N];
inline bool myru_x(gyq x,gyq y){return x.x<y.x;}
inline bool myru_y(gyq x,gyq y){return x.y<y.y;}
int main()
{
    int i,j;
    int n=rin();
    for(i=1;i<=n;i++)a[i].init();
    LL sum;
    sort(a+1,a+n+1,myru_x);
    for(i=1,sum=0;i<=n;i++)sum+=a[i].x,a[i].sum+=a[i].x*i-sum+(s_x-sum)-a[i].x*(n-i);
    sort(a+1,a+n+1,myru_y);
    for(i=1,sum=0;i<=n;i++)sum+=a[i].y,a[i].sum+=a[i].y*i-sum+(s_y-sum)-a[i].y*(n-i);
    LL ans=0x3f3f3f3f3f3f3f3f;
    for(i=1;i<=n;i++)ans=min(ans,a[i].sum);
    printf("%lld\n",ans>>1);
    return 0;
}

标签:曼哈顿,max,LL,距离,比夫,切雪
来源: https://www.cnblogs.com/zjjws/p/14126313.html