题目描述

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

每个小松鼠的家可以用一个点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。

30%的数据,0 ≤ N ≤ 1000

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

输入输出格式

输入格式:

第一行是一个整数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

思路:

本题实质是给出 n 个点,找出一个点 x,然后使得其他 n-1 个点到 x 的切比雪夫距离最小,之后求距离和的最小值

而需要求 n 个点切比雪夫距离的和时,由于要穷举其他 n-1 个点到当前点的距离,即计算:

可以发现,每次计算距离都要取 max,每次都是一个 O(n) 的计算过程,总时间复杂度可达 O(n^2),复杂度太高,而曼哈顿距离只有求和与取绝对值两种运算,因此我们可以考虑将切比雪夫距离转化为曼哈顿距离,然后利用前缀和优化,进而降低时间复杂度。

设  为从 i 到 j 曼哈顿距离,那么有:,复杂度仍是 O(n^2)

进一步化简,有:

同时以 dis(i,j) 中的一部分  举例化简,有:

若先将横坐标处理为递增的,那么易得  前的部分是可以继续拆绝对值化简的, 后的部分是  的,因此进一步可化简为:

可以发现上式子是一个前缀和,而  部分与上式同理,因此我们只需要维护有序状态下  的值即可。

此时,各步骤的时间复杂度如下:

  • 坐标变换:O(n)
  • 前缀和处理:O(n)
  • 枚举每个点:O(n)
  • 计算一个点的答案:O(log n)

总时间复杂度即为:O(nlog n),相较于之前的 O(n^2),已有了极大的优化。

源代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<bitset>
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
#define LL long long
#define Pair pair<int,int>
LL quickPow(LL a,LL b){ LL res=1; while(b){if(b&1)res*=a; a*=a; b>>=1;} return res; }
LL multMod(LL a,LL b,LL mod){ a%=mod; b%=mod; LL res=0; while(b){if(b&1)res=(res+a)%mod; a=(a<<=1)%mod; b>>=1; } return res%mod;}
LL quickMultPowMod(LL a, LL b,LL mod){ LL res=1,k=a; while(b){if((b&1))res=multMod(res,k,mod)%mod; k=multMod(k,k,mod)%mod; b>>=1;} return res%mod;}
LL quickPowMod(LL a,LL b,LL mod){ LL res=1; while(b){if(b&1)res=(a*res)%mod; a=(a*a)%mod; b>>=1; } return res; }
LL getInv(LL a,LL mod){ return quickPowMod(a,mod-2,mod); }
LL GCD(LL x,LL y){ return !y?x:GCD(y,x%y); }
LL LCM(LL x,LL y){ return x/GCD(x,y)*y; }
const double EPS = 1E-6;
const int MOD = 1000000000+7;
const int N = 100000+5;
const int dx[] = {0,0,-1,1,1,-1,1,1};
const int dy[] = {1,-1,0,0,-1,1,-1,1};
using namespace std;struct Node {LL x, y;
} node[N];
int n, x[N], y[N];
LL sum1[N], sum2[N];
int main() {scanf("%d", &n);for (int i = 1; i <= n; i++) {int a, b;scanf("%d%d", &a, &b);x[i] = node[i].x = a + b;y[i] = node[i].y = a - b;}sort(x + 1, x + n + 1);sort(y + 1, y + n + 1);for (int i = 1; i <= n; i++){sum1[i] = sum1[i - 1] + x[i];sum2[i] = sum2[i - 1] + y[i];}LL res=1ll << 62;for (int i = 1; i <= n; i++) {int pos = lower_bound(x + 1, x + n + 1, node[i].x) - x;LL sum = sum1[n] - sum1[pos] - node[i].x * (n - pos) + node[i].x * pos - sum1[pos];pos = lower_bound(y + 1, y + n + 1, node[i].y) - y;sum += sum2[n] - sum2[pos] - node[i].y * (n - pos) + node[i].y * pos - sum2[pos];res = min(res, sum);}printf("%lld\n", res / 2);return 0;
}

松鼠聚会(洛谷-P3964)相关推荐

  1. 洛谷 P3964 [TJOI2013]松鼠聚会(切比雪夫距离和曼哈顿距离转换)

    这个距离的定义就是切比雪夫距离的定义.切比雪夫距离的计算式子是:d = max(|x1 - x2|,|y1 - y2|) 在切比雪夫距离的定义下,一个点和周围相邻的8个点的距离相等(都为1). 如果将 ...

  2. 洛谷P3964 [TJOI2013]松鼠聚会 切比雪夫距离转曼哈顿距离

    https://www.luogu.com.cn/problem/P3964 切比雪夫距离为max(|x-o.x|,|y-o.y|),曼哈顿距离为|x-o.x|+|y-o.y| 当我们要求n个点的到1 ...

  3. 洛谷 P3964 松鼠聚会

    题目链接 参考链接 题解: 这道题目的距离其实就是切比雪夫距离,又称棋盘距离,也就是D=max(∣x2−x1∣,∣y2−y1∣)D = max(|x_2-x_1|,|y_2-y_1|)D=max(∣x ...

  4. 洛谷P3964松鼠聚会

    题目 题意:求最小的从某一个点到其余点的切比雪夫距离和. 将一个图中的\((x,y)\)坐标转到新坐标\((x+y,x-y)\)后,图中的曼哈顿距离就是新图中的切比雪夫距离, 证明:分类讨论, 1.\ ...

  5. P1293 班级聚会洛谷c++题解

    P1293 班级聚会 题目描述 毕业25年以后,我们的主人公开始准备同学聚会.打了无数电话后他终于搞到了所有同学的地址.他们有些人仍在本城市,但大多数人分散在其他的城市.不过,他发现一个巧合,所有地址 ...

  6. 洛谷 P3258 [JLOI2014]松鼠的新家 树上差分

    缘起 [1]中我们学习了树上差分,并且a了一个裸的点差分. 现在继续树上差分~ 洛谷 P3258 [JLOI2014]松鼠的新家 分析 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房 ...

  7. 洛谷· [AHOI2008]紧急集合 / 聚会

    初见安~这里是传送门:洛谷P4281紧急集合/聚会 题目描述 欢乐岛上有个非常好玩的游戏,叫做"紧急集合".在岛上分散有N个等待点,有N-1条道路连接着它们,每一条道路都连接某两个 ...

  8. P3964 [TJOI2013]松鼠聚会

    HyperlinkHyperlinkHyperlink https://www.luogu.org/problemnew/show/P3964 DescriptionDescriptionDescri ...

  9. P3964 [TJOI2013]松鼠聚会【切比雪夫距离】

    P3964 [TJOI2013]松鼠聚会 题意:给出nnn个点(xi,yi)(x_i,y_i)(xi​,yi​),找到某个点,使得所有点到该点的切比雪夫距离和最小. 一. A(x1,y1),B(x2, ...

最新文章

  1. ORACLE导入Excel数据
  2. GoldenGate技术架构(二)
  3. Docker 的基本原理及快速入门
  4. 代码管理 防止员工_低代码开发现形记
  5. syslog 向内存中缓存_动画:深入浅出从根上理解 HTTP 缓存机制及原理!
  6. java 柯里化_函数式编程(Java描述)——Java中的函数及其柯里化
  7. 2020年11月国产数据库排行: PingCAP融资破记录,PolarDB登云巅,达梦南大壮心雄
  8. oracle ebs wsh picking batch,ebs 11i 订单相关表结构学习及销售到出仓所经历的表
  9. legend2---开发日志3(thinkphp的入口目录是public的体现是什么)
  10. JAVA中获取安装路径、运行路径、执行路径的办法
  11. 阿里云Flink SQL开发指南——字符串函数——REGEXP_REPLACE正则替换
  12. 廊坊交警利用智能交通管控平台助力平安建设工作
  13. LCD12864图片字模生成
  14. 用Python回忆QQ空间里的青春
  15. 2022NISCTF--web
  16. 机器学习练习----神经网络的标准BP算法(误差逆传播算法)
  17. 信创只是开始_《作业帮高管团队亲笔信:D轮只是开始,一切归零,重新出发》...
  18. 【NISP一级】考前必刷九套卷(三)
  19. 苹果笔记本接移动硬盘怎么使用
  20. MySQL42000错误

热门文章

  1. 服务器 发布 WebService 错误
  2. 从起源到未来:能自己编程和改进的超人工智能会出现吗?
  3. S5PV210裸机之重定位
  4. java 内核驱动程序_内核第三讲,进入ring0,以及编写第一个内核驱动程序.
  5. 用python画桃花_python 画图
  6. 操作无法完成因为已经在mysqld.exe上打开_金蝶KIS软件操作技巧/百问百答(下)...
  7. 又有程序员把产品经理给打了!
  8. 不懂别瞎搞!Redis 性能优化的 13 条军规!
  9. 春节!免费送出一个佳能相机!
  10. 亿级流量请求,多级缓存解救