bzoj3170: [Tjoi2013]松鼠聚会

本文介绍了一种将切比雪夫距离转换为曼哈顿距离的算法,并给出了具体的实现代码。该算法利用了前缀和的思想来简化计算过程,还提到了两者之间的面积比为1:2的关系。

实际上这个距离就是切比雪夫距离

可以转换成曼哈顿距离,给出公式

(x1,y1)->(x2,y2)的切比雪夫距离==(x1+y1,x1-y1)->(x2+y2,x2-y2)的曼哈顿距离/2

那么曼哈顿就好搞了吧,直接一波前缀和

 

还有面积比是1:2(曼哈顿:切比雪夫)

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;

struct node
{
    LL x,y;
}a[110000];
LL xx[110000],yy[110000];
LL sumx[110000],sumy[110000];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld%lld",&a[i].x,&a[i].y);
        a[i].x+=a[i].y;a[i].y=a[i].x-2*a[i].y;
        xx[i]=a[i].x;yy[i]=a[i].y;
    }
    
    sort(xx+1,xx+n+1);
    sumx[0]=0;for(int i=1;i<=n;i++)sumx[i]=sumx[i-1]+xx[i];
    sort(yy+1,yy+n+1);
    sumy[0]=0;for(int i=1;i<=n;i++)sumy[i]=sumy[i-1]+yy[i];
    
    LL ans=(1LL<<62);
    for(int i=1;i<=n;i++)
    {
        LL sum=0,id;
        
        id=lower_bound(xx+1,xx+n+1,a[i].x)-xx;
        sum+=((id-1)*xx[id]-sumx[id-1])+((sumx[n]-sumx[id])-(n-id)*xx[id]);
        
        id=lower_bound(yy+1,yy+n+1,a[i].y)-yy;
        sum+=((id-1)*yy[id]-sumy[id-1])+((sumy[n]-sumy[id])-(n-id)*yy[id]);
        
        ans=min(ans,sum);
    }
    printf("%lld\n",ans/2);
    return 0;
}

 

转载于:https://www.cnblogs.com/AKCqhzdy/p/8946764.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值