题目:

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

每个小松鼠的家可以用一个点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的家的坐标。(0≤N≤105,−109x,y≤109)

输出

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

样例输入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)聚会

题解:此题中定义的两点间距离,稍加分析就会发现是max(|xi-xj|, |yi-yj|);

此时需要用到一个公式:

        max(|a|,|b|)=|(a+b)/2|+|(a-b)/2|;

于是,两点间距离成了:

        |(xi-xj+yi-yj)/2|+|(xi-xj-yi+yj)/2|

      =   (|(xi+yi) - (xj+yj)| + |(xi-yi)-(xj-yj)|)/2

公式中需要用xi+yi, xi-yi的值,这其实对应于点(xi,yi)在另一个坐标系中的坐标。我们对原来的点坐标做变换,令x'=x+y, y'=x-y,则上面的公式变成了:

        (|xi'-xj'| + |yi'-yj'|)/2

分析到这儿就好做了,对于给定的点pi, 计算∑(|xi'-xj'| + |yi'-yj'|)/2还是很容易的,先整体做一遍预处理,按x排序计算一遍x坐标的前缀和,再按y排序,计算一次y坐标的前缀和就可以了。

代码如下:

 #include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
#define ll long long
#define N 101000
struct point {
ll x, y;
ll sx, sy;
int cx, cy;
}p[N]; ll sumx, sumy; bool cmpx(point a, point b){
return a.x < b.x;
} bool cmpy(point a, point b){
return a.y < b.y;
} int main()
{
int n;
while(~scanf("%d", &n))
{
sumx = sumy = ;
ll x, y;
for(int i = ; i < n; i++)
{
scanf("%lld %lld", &x, &y);
p[i].x = x+y, p[i].y = x-y;
sumx += p[i].x, sumy += p[i].y;
}
sort(p, p+n, cmpx);
p[].sx = p[].cx = ;
for(int i = ; i < n; i++)
{
p[i].sx = p[i-].sx + p[i-].x;
p[i].cx = p[i-].cx + ;
} sort(p, p+n, cmpy);
p[].sy = p[].cy = ;
for(int i = ; i < n; i++)
{
p[i].sy = p[i-].sy + p[i-].y;
p[i].cy = p[i-].cy + ;
}
ll ans = -;
for(int i = ; i < n; i++)
{
ll tm = p[i].cx*p[i].x - p[i].sx + (sumx-p[i].sx-p[i].x)-((n-p[i].cx-)*p[i].x);
tm += p[i].cy*p[i].y - p[i].sy + (sumy-p[i].sy-p[i].y)-((n-p[i].cy-)*p[i].y);
if(ans == - || tm < ans)ans = tm;
}
printf("%lld\n", ans/);
}
return ;
}

toj 4602 松鼠聚会的更多相关文章

  1. bzoj-3170 3170: [Tjoi 2013]松鼠聚会(计算几何)

    题目链接: 3170: [Tjoi 2013]松鼠聚会 Time Limit: 10 Sec  Memory Limit: 128 MB Description 有N个小松鼠,它们的家用一个点x,y表 ...

  2. BZOJ3170: [Tjoi 2013]松鼠聚会

    3170: [Tjoi 2013]松鼠聚会 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 531  Solved: 249[Submit][Statu ...

  3. BZOJ 3170: [Tjoi 2013]松鼠聚会 切比雪夫距离

    3170: [Tjoi 2013]松鼠聚会 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...

  4. BZOJ 3170: [Tjoi 2013]松鼠聚会( sort )

    题目的距离为max(|x1-x2|, |y1-y2|) (切比雪夫距离). 切比雪夫距离(x, y)->曼哈顿距离((x+y)/2, (x-y)/2) (曼哈顿(x, y)->切比雪夫(x ...

  5. [Tjoi 2013]松鼠聚会

    3170: [Tjoi 2013]松鼠聚会 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1318  Solved: 664[Submit][Stat ...

  6. BZOJ_3170_[Tjoi2013]松鼠聚会_切比雪夫距离+前缀和

    BZOJ_3170_[Tjoi2013]松鼠聚会_切比雪夫距离+前缀和 题意:有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点, ...

  7. 洛谷P3964 [TJOI2013]松鼠聚会 [二分答案,前缀和,切比雪夫距离]

    题目传送门 松鼠聚会 题目描述 草原上住着一群小松鼠,每个小松鼠都有一个家.时间长了,大家觉得应该聚一聚.但是草原非常大,松鼠们都很头疼应该在谁家聚会才最合理. 每个小松鼠的家可以用一个点x,y表示, ...

  8. 【BZOJ】【3170】【TJOI2103】松鼠聚会

    切比雪夫距离+曼哈顿距离 题解:http://www.cnblogs.com/zyfzyf/p/4105456.html 其实应该先做这题再做[BZOJ][3210]花神的浇花集会的吧…… 我们发现d ...

  9. 【bzoj3170】[Tjoi2013]松鼠聚会

    3170: [Tjoi2013]松鼠聚会 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1670  Solved: 885[Submit][Statu ...

随机推荐

  1. RabbitMQ-Window安装(一)

    1.登录RabbitMq官网http://www.rabbitmq.com/ 2.点击Get Started 3.点击Download+Installation 4.找到Windows,点击 5.点击 ...

  2. jsplumb+dragable+vue(一)

    基于vue的jsplumb,支持拖拽生成节点,节点双击展示更多信息,节点连线,删除节点,删除连线,重绘连接图,当前页面刷新连接图,根据json画连接图等功能 本章主要讲 拖拽生成节点 获取链接图的信息 ...

  3. 2017华南理工华为杯D bx回文

    比赛的时候队友过了,补补题XD. 题目链接:https://scut.online/p/125(赛后补题) 125. 笔芯回文     题目描述 bx有一个长度一个字符串S,bx可以对其进行若干次操作 ...

  4. jQuery file upload测试

    <input id="fileupload" type="file" name="files[]" data-url="Ha ...

  5. JAVA一切皆对象之包装类、自动装箱、自动拆箱

    首先封装一个基本数据类型int, class P{ private int number; //封装一个私有的->基本数据类型 public P(){} public P(int number) ...

  6. 【CDN+】 Hive 入门 以及Handoop 系统认知

    前言 本文主要介绍Hive 的基础概念,以及Handoop的大体架构,组件依赖,对于大数据有个总体的认识 Hive 基础概念 官网:https://hive.apache.org/ The Apach ...

  7. Test Case Design Method - OATS

    [转载] OATS:即Orthogonal Array Testing Strategy,正交表测试策略. 1      OATS的概念: 次数(Runs):简单的说,就是次数是多少,就有多少个用例. ...

  8. WPS for linux 中不能切换到中文输入法

    转载自:http://blog.sciencenet.cn/blog-200199-1032795.html 尽管安装有中文输入法,wps有时仍然不能切换到中文输入法,此问题解决方案如下: 根账户下打 ...

  9. 《JAVA设计模式》之单例模式(Singleton)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述单例模式的: 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 单例模式的 ...

  10. mybatis开发注意事项:字段名称以及表名

    在使用mybatis开发中,数据库设计的时候字段名称最好不要带下划线,推荐使用驼峰命名法 数据表的名称第一个字母大写