描述

有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点,距离为1。现在N个松鼠要走到一个松鼠家去,求走过的最短距离。

题解

简直就是个高中数学题啊。。。蒟蒻数学不好,学不来呜

松鼠$i $ 和 $j$ 的距离为$ \max{\left\vert X_i - X_j \right\vert, \left\vert Y_i - Y_j\right\vert } $

但是我们不能在很短的时间内求出对于所有$i$和$j$ 的$\max$, 所以只能通过加绝对值让$\max$去掉。

首先1.  $\max{a, b} = (\left\vert a + b\right\vert + \left\vert a - b\right\vert) \div 2$

并且 2.$ \left\vert \left\vert a\right\vert - \left\vert b\right\vert \right\vert + \left\vert \left\vert a\right\vert  + \left\vert b\right\vert \right\vert  = \left\vert a - b\right\vert + \left\vert a + b\right\vert$

我们通过式子1算出$ \max{\left\vert X_i - X_j \right\vert, \left\vert Y_i - Y_j\right\vert }  = ( \left\vert \left\vert  X_i - X_j \right\vert - \left\vert Y_i - Y_j\right\vert \right\vert + \left\vert \left\vert X_i - X_j \right\vert  + \left\vert Y_i - Y_j \right\vert \right\vert ) \div 2$

然后再通过2式就变成了 $( \left\vert ( X_i-Y_i ) - (X_j - Y_j) \right\vert + \left\vert (X_i - Y_i)  + (X_j - Y_j) \right\vert) \div 2$

令$a_i = X_i - Y_i $ $b_i = X_i + Y_i$

算出所有的$\left\vert a_i  - a_j \right\vert $ 和$\left\vert b_i - b_j\right\vert$ 再除 2, 取答案最小的$i$

算$\left\vert a_i  - a_j \right\vert $ 时需要排序求前缀和计算。

打绝对值累死我了。。、

代码

 #include<cstring>
#include<cstdio>
#include<algorithm>
#define rd read()
#define ll long long
using namespace std; const int N = 2e5; ll sumx[N], sumy[N], n, ans = 1e18; struct node {
ll x, y;
ll xx, yy;
ll disx, disy;
}a[N]; ll read() {
ll X = , p = ; char c = getchar();
for(; c > '' || c < ''; c = getchar()) if(c == '-') p = -;
for(; c >= '' && c <= ''; c = getchar()) X = X * + c - '';
return X * p;
} int cmpx(const node &A, const node &B ) {
return A.xx < B.xx;
} int cmpy(const node &A, const node &B) {
return A.yy < B.yy;
} int main()
{
n = rd;
for(int i = ; i <= n; ++i) {
a[i].x = rd * ;
a[i].y = rd * ;
a[i].xx = (a[i].x + a[i].y) >> ;
a[i].yy = (a[i].x - a[i].y) >> ;
}
sort(a+, a++n, cmpx);
for(int i = ; i <= n; ++i) sumx[i] = sumx[i - ] + a[i].xx;
for(int i = ; i <= n; ++i) {
a[i].disx = a[i].xx * i - sumx[i];
a[i].disx += sumx[n] - sumx[i] - (n - i) * a[i].xx;
}
sort(a+, a++n, cmpy);
for(int i = ; i <= n; ++i) sumy[i] = sumy[i - ] + a[i].yy;
for(int i = ; i <= n; ++i) {
a[i].disy = a[i].yy * i - sumy[i];
a[i].disy += sumy[n] - sumy[i] - (n - i) * a[i].yy;
if(a[i].disy + a[i].disx < ans) ans = a[i].disx + a[i].disy;
}
printf("%lld\n", ans >> );
}

BZOJ3170: [Tjoi2013]松鼠聚会 - 暴力的更多相关文章

  1. BZOJ3170: [Tjoi2013]松鼠聚会(切比雪夫距离转曼哈顿距离)

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1524  Solved: 803[Submit][Status][Discuss] Descripti ...

  2. BZOJ3170 [Tjoi2013]松鼠聚会 切比雪夫距离 - 曼哈顿距离 - 前缀和

    BZOJ3170 题意: 有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点,距离为1.现在N个松鼠要走到一个松鼠家去,求走过的最 ...

  3. BZOJ3170: [Tjoi2013]松鼠聚会

    [传送门:BZOJ3170] 简要题意: 给出n个点的坐标,规定两个点的距离=max(|x1-x2|,|y1-y2|) 要求选出一个点,使得这个点到所有点的距离和最小 题解: 切比雪夫转换例题 将一个 ...

  4. Bzoj3170: [Tjoi2013]松鼠聚会 (切比雪夫距离)

    题目链接 显然,题目要求我们求切比雪夫距离,不会的可以去看一下attack的博客. 考虑枚举所有的点 转换为曼哈顿距离后. 那么对于这个点的路程和是. \[\sum_{i=1}^n | x_i - x ...

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

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

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

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

  7. [TJOI2013]松鼠聚会 曼哈顿距离

    [TJOI2013]松鼠聚会 luogu P3964 首先容易得到两点间距离是\(max(|x_1-x_2|, |y_1-y_2|)\)(即切比雪夫距离) 然后有个套路:原\((x,y)\)求曼哈顿距 ...

  8. [TJOI2013]松鼠聚会(枚举)

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

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

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

随机推荐

  1. 微信小程序教程系列

    微信小程序教程系列 来源:       https://blog.csdn.net/michael_ouyang/article/details/56846185 相关连接:http://blog.c ...

  2. linux随机数

    linux系统随机数生成;1,利用uuid(universally unique identifier),由open software foundation在distributed computing ...

  3. leetcode743

    class Solution { public: int networkDelayTime(vector<vector<int>>& times, int N, int ...

  4. delphi RAD XE 安装路径 重装备份

    重装的时候,不要删除c盘C:\ProgramData下的guid目录.以便完整卸载旧版本. 控件安装的生成的目标文件路径 C:\Users\Public\Documents\Embarcadero\S ...

  5. JS、CSS以及img对DOMContentLoaded事件的影响

    最近在做性能有关的数据上报,发现了两个非常有意思的东西:Chrome开发者工具的Timeline分析面板,以及DOMContentLoaded事件.一个是强大的令人发指的性能分析工具,一个是重要的性能 ...

  6. Asp.Net Core参考资料

    Every day up!!!!!! 1.Asp.Net官方文档 2.<Professional C# 6 and .NET Core 1.0> 翻译 3.ASP.NET Core中文文档 ...

  7. CSS选择器学习小结

    关于CSS选择器的问题,在实际项目中,以及一般的前端面试中会经常遇到.下面对此做一小结,梳理和巩固相关方面知识.(如有不妥之处,还望大家及时批评指正,以免误导他人) 一.选择器种类 1.id选择器(# ...

  8. redis启动.停止.重启

    Linux下安装 ]# wget http://download.redis.io/releases/redis-2.8.17.tar.gz ]# tar xzf redis-2.8.17.tar.g ...

  9. UNION会自动删除重复项,union与union all的差异

    UNION会自动删除重复项,刷选出部分字段的时候要注意了,如果刷选出来的两个字段的值完全相同就会剩下一个. UNION ALL 和 UNION 不同之处在于 UNION ALL 会将左右两个查询的结果 ...

  10. Haskell语言学习笔记(52)正则表达式

    Text.Regex.PCRE.Heavy $ brew install pcre $ cabal install pcre-heavy Installed pcre-heavy-1.0.0.2 Pr ...