题目:

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

每个小松鼠的家可以用一个点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. C# windows窗口应用程序切换主界面的显示内容

    不知道说清楚没有?就是我的窗口分为两部分,左边,控制部分,由一些按钮组成右边,显示部分,由些控件(如下拉,文本等等组成) 左边的每个按钮对应显示部分的页面,也就是说,左边换一个按钮点,那么右边就显示其 ...

  2. (1)消灭初级程序员常用的多层if-else嵌套--------------【表驱动法】

    表驱动法 1.相信很多刚从事工作的程序员或一些初级程序员在写代码的时候会出现对一些逻辑判断写成多层if-else嵌套的经历,这种方式在一些简单的层次中运用起来确实可行,但对于一些大型项目逻辑判断比较多 ...

  3. 170821-关于SpringMVC的知识点

    1.SpringMVC 概述以及优势 SpringMVC和Spring的关系:  软件开发的三层架构: web层[表示层.表现层]---->Service层---->Dao[DataBas ...

  4. log4j file 路径

    默认以System.getProperty("user.dir")为准 用LOGGER.warn(System.getProperty("user.dir")) ...

  5. eclipse 启动 tomcat 报错:Server mylocalhost was unable to start within 45 seconds

    这个专门转载一篇博文也是为了讽刺一下自己二逼的程序员职业,哈哈. eclipse启动tomcat服务器报错:Server mylocalhost was unable to start within ...

  6. PHP不使用内置函数intval(),实现字符串转整数

    平时我们用PHP时,将字符串转化为整型时,一般都是使用 intval() 内置函数,那么如果我们自己写,怎么写一个呢? 此时我们可以利用 ASCII 码计算得整数的特性,因为每个字符都对应一个 ASC ...

  7. 设计模式 - 建造者模式 Builder Pattern

    简介 场景 在创建复杂对象时,用户无须关心该对象所包含的属性以及它们的组装方式,只需要指定复杂对象的类型和内容就可以构建它们. 模式定义 建造者模式:将一个复杂对象的构建与表示分离,使得同样的构建过程 ...

  8. ADFS 2016 & Dynamics CRM

    参考:https://blog.csdn.net/vic0228/article/details/80188291 webapp 获取token https://adfs.demo.local/adf ...

  9. v-if指令

    <!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. JavaScript 高级程序设计(第3版)第二章 (在html中使用js)

    1.script元素的属性(6个):①async(异步脚本),只对外部脚本有效 ②defer(延迟脚本),只对外部脚本有效 ③charset,src(可跨域),type,language 2.尽可能使 ...