[TJOI2013]松鼠聚会(枚举)

Posted lsgjcya

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[TJOI2013]松鼠聚会(枚举)相关的知识,希望对你有一定的参考价值。

[TJOI2013]松鼠聚会

题目描述

草原上住着一群小松鼠,每个小松鼠都有一个家。时间长了,大家觉得应该聚一聚。但是草原非常大,松鼠们都很头疼应该在谁家聚会才最合理。

每个小松鼠的家可以用一个点x,y表示,两个点的距离定义为点(x,y)和它周围的8个点(x-1,y)(x+1,y),(x,y-1),(x,y+1).(x-1,y+1),(x-1,y-1),(x+1,y+1),(x+1,y-1)距离为1。

输入输出格式

输入格式:

第一行是一个整数N,表示有多少只松鼠。接下来N行,第i行是两个整数x和y,表示松鼠i的家的坐标

输出格式:

一个整数,表示松鼠为了聚会走的路程和最小是多少。

输入输出样例

输入样例#1:

6
-4 -1
-1 -2
2 -4
0 2
0 3
5 -2

输出样例#1:

20

输入样例#2:

6
0 0
2 0
-5 -2
2 -2
-1 2
4 0

输出样例#2:

15

说明

样例解释

在第一个样例中,松鼠在第二只松鼠家(-1,-2)聚会;在第二个样例中,松鼠在第一只松鼠家(0.0)聚会。

数据范围

30%的数据,0 ≤ N ≤ 1000

100%的数据,0 ≤ N ≤ 100000; ?10^9 ≤ x, y ≤ 10^9

第一次听说切比雪夫距离这个东西,它可以这样与曼哈顿距离转换。

将一个点 (x,y) 的坐标变为 ((x+y,x?y)) 后,原坐标系中的曼哈顿距离 = 新坐标系中的切比雪夫距离
将一个点 (x,y) 的坐标变为 ((frac{x+y}{2},frac{x-y}{2})) 后,原坐标系中的切比雪夫距离 = 新坐标系中的曼哈顿距离
于是我们把原坐标系转化一下,转成更加熟悉的曼哈顿距离。

考虑枚举在哪只松鼠家聚会,聚会的路程为(sum|X_i-X|+|Y_i-Y|),但是这样绝对值很难处理。我们可以把X[],Y[]排序,然后查找一下X,Y位置,通过前缀和处理一下就能快速算答案了。

为什么最小的点答案都会超过1<<40???
然后顺序加会long long,换一下加减法顺序就过了???

#include<bits/stdc++.h>
#define lll long long
using namespace std;
lll read(){
    lll x=0,w=1;char ch=getchar();
    while(ch>'9'||ch<'0'){if(ch=='-')w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
    return x*w;
}
const lll N=100010;
lll n,p,q,sx,sy,ans=(1ll<<62);
lll x[N],y[N],xx[N],yy[N],sumx[N],sumy[N];
lll check1(lll v){
    lll l=1,r=n;
    while(l<r){
        lll mid=(l+r)/2;
        if(x[mid]>=v)r=mid;
        else l=mid+1;
    }return l;
}
lll check2(lll v){
    lll l=1,r=n;
    while(l<r){
        lll mid=(l+r)/2;
        if(y[mid]>=v)r=mid;
        else l=mid+1;
    }return l;
}
int main(){
    n=read();
    for(lll i=1;i<=n;i++){
        p=read();q=read();
        xx[i]=x[i]=p+q;yy[i]=y[i]=p-q;
    }
    sort(x+1,x+1+n);sort(y+1,y+1+n);
    for(lll i=1;i<=n;i++)
        sumx[i]=sumx[i-1]+x[i],sumy[i]=sumy[i-1]+y[i];
    for(lll i=1;i<=n;i++){
        lll p1=check1(xx[i]),p2=check2(yy[i]);
        sx=sumx[n]-sumx[p1]-(n-p1)*xx[i]+p1*xx[i]-sumx[p1];
        sy=sumy[n]-sumy[p2]-(n-p2)*yy[i]+p2*yy[i]-sumy[p2];
        ans=min(ans,sx+sy);
    }printf("%lld
",ans/2);
}

以上是关于[TJOI2013]松鼠聚会(枚举)的主要内容,如果未能解决你的问题,请参考以下文章

LuoguP3964 [TJOI2013]松鼠聚会切比雪夫距离/前缀和

3170: [Tjoi 2013]松鼠聚会

bzoj3170[Tjoi2013]松鼠聚会

luoguP3964 [TJOI2013]松鼠聚会

bzoj3170 [Tjoi 2013]松鼠聚会

[Tjoi2013]松鼠聚会