zoukankan      html  css  js  c++  java
  • [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);
    }
    
  • 相关阅读:
    62. 不同路径-dp-中等
    49. 字母异位词分组-字符串-中等
    34. 在排序数组中查找元素的第一个和最后一个位置-二分查找-中等
    33. 搜索旋转排序数组-二分查找-中等
    221. 最大正方形-dp-中等难度
    38. 外观数列-字符串-中等难度
    mysql-索引/视图/存储过程/函数/触发器
    mysql-常用命令
    MDK5.34发布,AC6升级至V6.16(2021-03-19)
    STM32H7的CAN FD教程笔记
  • 原文地址:https://www.cnblogs.com/lsgjcya/p/9789114.html
Copyright © 2011-2022 走看看