• bzoj3170: [Tjoi2013]松鼠聚会


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

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

    (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
    ",ans/2);
        return 0;
    }
  • 相关阅读:
    结构体
    指针
    数组
    银行取款机系统
    函数
    基础
    IOS系统的安装和Vi的操作模式以及简单的指令
    1203.4——循环语句 之 for
    1203.3——循环语句 之 while
    1203.2——条件语句 之 switch语句
  • 原文地址:https://www.cnblogs.com/AKCqhzdy/p/8946764.html
Copyright © 2020-2023  润新知