\(\\\)

曼哈顿距离


对于两个点\((x_1,y_1),(x_2,y_2)\),定义他们的曼哈顿距离为\(|x_1-x_2|+|y_1-y_2|\),即两坐标轴分别讨论差值再求和。

对于曼哈顿距离相同的点,他们分布在同一横纵截距且截距相同的直线上。

图中每一个正方形边界上的整点到原点的曼哈顿距离相同。

\(\\\)

切比雪夫距离


对于两个点\((x_1,y_1),(x_2,y_2)\),定义他们的曼哈顿距离为\(max\{|x_1-x_2|,|y_1-y_2|\}\),即两坐标轴分别讨论差值取最大。

对于切比雪夫距离相同的点,他们分布在以原点为中心的正方形边界上。

图中每一个正方形边界上的整点到原点的曼哈顿距离相同。

\(\\\)

曼哈顿距离转切比雪夫距离


考虑曼哈顿距离的表达式:\(|x_1-x_2|+|y_1-y_2|\),其实可以表示成:

\(\begin{align}max\{x_1-x_2+y_1-y_2,x_1-x_2+y_2-y_1,x_2-x_1+y_1-y_2,x_2-x_1+y_2-y_1\}\end{align}\)

考虑将两个点变化为\((x_1+y_1,x_1-y_1),(x_2+y_2,x_2-y_2)\)

那么变化后两点的切比雪夫距离为\(max((|(x_1+y_1)-(x_2+y_2)|,|(x_1-y_1)-(x_2-y_2)|)\)

若原来两点曼哈顿距离为\(x_1-x_2+y_1-y_2\)或\(x_2-x_1+y_2-y_1\)时,都可以表示为\(|(x_1+y_2)-(x_2+y_2)|\)

若原来两点曼哈顿距离为\(x_1-x_2+y_2-y_1\)或\(x_2-x_1+y_1-y_2\)时,都可以表示为\(|(x_1-y_1)-(x_2-y_2)|\)

将每一个点\((x,y)\)转化为\((x+y,x-y)\),新坐标系下的切比雪夫距离即为原坐标系下曼哈顿距离。

\(\\\)

切比雪夫距离转曼哈顿距离


按照刚才的思路再还原回去即可。

将每一个点\((x,y)\)转化为\((\frac{x+y}{2},\frac{x-y}{2})\),新坐标系下的曼哈顿距离即为原坐标系下切比雪夫距离。

这个转化一般比较常用,曼哈顿距离一般可以通过排序前缀和的方式降低计算复杂度。

注意到除法如果向下取整可能会使答案不正确,所以考虑先不除以\(2\),最后求完答案再除以\(2\)也是一样的,形象的理解可以说成,曼哈顿坐标系是通过切比雪夫坐标系旋转\(45^{\circ}\)后,再缩小到原来的一半得到的。

\(\\\)

一道例题


有\(N\)个二位平面上的点,定义每一个点到其八连通的点的距离为\(1\)。

选一个点,使得剩下所有点到该点的距离之和最小,求出这个距离之和。

  • \(N\in [0,10^5]\)

\(\\\)

题意即为求切比雪夫距离之和最小,暴力的做法是\(N^2\)的。

考虑将切比雪夫距离转化为曼哈顿距离,我们将横纵坐标分开排序求前缀和,这样既可快速求出,以一个点为中心,其他点到这个点的曼哈顿距离之和。

具体的做法是将两个坐标分开讨论,每次找到当前点在排序后数组的位置\(p\)。

那么它前面的点坐标都小于当前点,累加的答案为\(p\times x[i]-sum_p\)。

后面的点的坐标都大于当前点,反过来累加答案,为\((sum_n-sum_p)-(n-p)\times x[i]\)

对所有的点都求一遍,取最小值即可,复杂度\(\text O(NlogN)\)。

\(\\\)

#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 100010
#define R register
#define gc getchar
#define inf 900000000000000000
using namespace std;
typedef long long ll;inline ll rd(){ll x=0; bool f=0; char c=gc();while(!isdigit(c)){if(c=='-')f=1;c=gc();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();}return f?-x:x;
}ll n,ans=inf,x[N],y[N],sx[N],sy[N],sumx[N],sumy[N];int main(){n=rd();for(R ll i=1,xx,yy;i<=n;++i){xx=rd(); yy=rd();sx[i]=x[i]=xx+yy; sy[i]=y[i]=xx-yy;}sort(sx+1,sx+1+n);sort(sy+1,sy+1+n);for(R ll i=1;i<=n;++i){sumx[i]=sumx[i-1]+sx[i];sumy[i]=sumy[i-1]+sy[i];}for(R ll i=1,res;i<=n;++i){ll px=lower_bound(sx+1,sx+1+n,x[i])-sx;ll py=lower_bound(sy+1,sy+1+n,y[i])-sy;res=px*x[i]-sumx[px]+sumx[n]-sumx[px]-(n-px)*x[i];res+=py*y[i]-sumy[py]+sumy[n]-sumy[py]-(n-py)*y[i];ans=min(ans,res>>1);}printf("%lld\n",ans);return 0;
}

转载于:https://www.cnblogs.com/SGCollin/p/9636955.html

曼哈顿距离与切比雪夫距离的互化相关推荐

  1. 曼哈顿距离和切比雪夫距离链接

    存一下链接慢慢看 曼哈顿距离和切比雪夫距离 这个更清晰一些: 关于曼哈顿距离和切比雪夫距离 NN中常用的距离计算公式:欧式距离.曼哈顿距离.马氏距离.余弦.汉明距离

  2. 曼哈顿距离与切比雪夫距离的转化及prufer序列

    目录 曼哈顿距离与切比雪夫距离的相互转化 prufer序列 1. 曼哈顿距离 与 切比雪夫距离 的相互转化 曼哈顿距离 |x1−x2|+|y1−y2|=max(x1−x2+y1−y2,x1−x2−y1 ...

  3. ML:图像数据、字符串数据等计算相似度常用的十种方法(余弦相似性、皮尔逊、闵可夫斯基距离/曼哈顿距离/欧氏距离/切比雪夫距离、马氏距离、汉明距离、编辑距离、杰卡德相似系数、相对熵/KL散度、Helli

    ML:图像数据.字符串数据等计算相似度常用的十种方法(余弦相似性.皮尔逊.闵可夫斯基距离/曼哈顿距离/欧氏距离/切比雪夫距离.马氏距离.汉明距离.编辑距离.杰卡德相似系数.相对熵/KL散度.Helli ...

  4. 什么是范数,及其对应的 “曼哈顿距离“、“欧式距离“、“闵氏距离“、“切比雪夫距离“

    什么是范数,及其对应的 "曼哈顿距离"."欧式距离"."闵氏距离"."切比雪夫距离" 一.什么是范数 二.欧式距离(对应 ...

  5. 数据的距离度量 一、欧式距离,曼哈顿距离,闵氏距离,切比雪夫距离,兰氏距离,马氏距离

    数据的距离度量 一.欧式距离,曼哈顿距离,闵氏距离,切比雪夫距离,兰氏距离,马氏距离 前言 欧式距离 标准欧式距离 曼哈顿距离 闵氏距离 切比雪夫距离 兰氏距离 马氏距离 前言 本篇记录一下常用的数据 ...

  6. 曼哈顿距离和切比雪夫距离转换

    设平面空间内存在两点,它们的坐标为(x1,y1) (x2,y2) 曼哈顿距离 dis=|x1−x2|+|y1−y2|,即两点横纵坐标差之和. 切比雪夫距离 dis=max(|x1−x2|,|y1−y2 ...

  7. 曼哈顿距离与切比雪夫距离及其相互转化

    文章目录 曼哈顿距离与切比雪夫距离及其相互转化 1.算法分析 1.1 曼哈顿距离 1.2 切比雪夫距离 1.3 两者之间的关系 1.4 用处 2.典型例题 曼哈顿距离与切比雪夫距离及其相互转化 1.算 ...

  8. 【计几】曼哈顿距离与切比雪夫距离

    讲解链接: 距离 OI Wiki 曼哈顿距离与切比雪夫距离:为何要相互转化 我们设 dM(A,B)d_M(A,B)dM​(A,B) 为点 AAA 和点 BBB 的曼哈顿距离, dQ(A,B)d_Q(A ...

  9. 三维马氏距离_各种距离(欧氏距离、曼哈顿距离、切比雪夫距离、马氏距离等)...

    引用:http://blog.csdn.net/shiwei408/article/details/7602324 在做分类时常常需要估算不同样本之间的相似性度量(SimilarityMeasurem ...

最新文章

  1. 目标检测coco数据集点滴介绍
  2. 怎样用python画雪花_python使用turtle库与random库绘制雪花
  3. 05用线程类Thread开启线程
  4. 为 Visual Studio 安装数据库工具
  5. mysql日期加减计算
  6. 解决The current branch is not configured for pull No value for key branch.master.merge found in config
  7. Java中各种整形类型可以表示的范围
  8. Spring boot 上传文件大小限制
  9. 每年扫码千亿次!微信官方开源了自家优化的二维码引擎!3行代码让你拥有微信扫码能力...
  10. 小米金融:与涉案的“山东小米金融服务外包有限公司”无关系
  11. 论文笔记_S2D.45_DeepVO: 基于深度循环卷积神经网络的端到端视觉里程计
  12. 通过数据,从键盘录入学生考试科目数,然后依次录入学的每一科分数.使用数组存储学生分数.然后输出总分,平均分,简单易理解
  13. 南山科技园的IDC机房怎么样?
  14. android应用跳文件管理,10款优秀Android文件管理器应用
  15. android投屏功能开发,Android DLNA投屏-基于CyberGarage开发投屏功能
  16. 从网络中获取债券收益率数据
  17. 微信开挂怎么防止封号_再也不怕被封号!微信养号秘笈教你防封号防降权
  18. Docker 部署微服务
  19. 微信小程序_在当前页面刷新数据 / 重载当前页面
  20. java ms932_Shift_JIS, MS932 and Unicode(收藏自网络)

热门文章

  1. 医药采购之供货商药品目录删除
  2. 【小吉带你学Git】Git命令(用户签名,本地库,暂存区,文件,版本 等命令)
  3. vue-cli是什么?
  4. “打工人”这个梗,怎么就突然火了?
  5. 前端快速搭建本地服务器的几种方法
  6. 计算机网络管理学到了什么以及不足,计算机网络管理心得
  7. 什么是软件开发工具包(SDK)
  8. 钢化玻璃与普通膜的区别
  9. JAVA文件上传详解(附源码)
  10. go每日新闻(2021-12-28)——深入理解Go Json.Unmarshal精度丢失之谜