曼哈顿距离与切比雪夫距离的互化
\(\\\)
曼哈顿距离
对于两个点\((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
曼哈顿距离与切比雪夫距离的互化相关推荐
- 曼哈顿距离和切比雪夫距离链接
存一下链接慢慢看 曼哈顿距离和切比雪夫距离 这个更清晰一些: 关于曼哈顿距离和切比雪夫距离 NN中常用的距离计算公式:欧式距离.曼哈顿距离.马氏距离.余弦.汉明距离
- 曼哈顿距离与切比雪夫距离的转化及prufer序列
目录 曼哈顿距离与切比雪夫距离的相互转化 prufer序列 1. 曼哈顿距离 与 切比雪夫距离 的相互转化 曼哈顿距离 |x1−x2|+|y1−y2|=max(x1−x2+y1−y2,x1−x2−y1 ...
- ML:图像数据、字符串数据等计算相似度常用的十种方法(余弦相似性、皮尔逊、闵可夫斯基距离/曼哈顿距离/欧氏距离/切比雪夫距离、马氏距离、汉明距离、编辑距离、杰卡德相似系数、相对熵/KL散度、Helli
ML:图像数据.字符串数据等计算相似度常用的十种方法(余弦相似性.皮尔逊.闵可夫斯基距离/曼哈顿距离/欧氏距离/切比雪夫距离.马氏距离.汉明距离.编辑距离.杰卡德相似系数.相对熵/KL散度.Helli ...
- 什么是范数,及其对应的 “曼哈顿距离“、“欧式距离“、“闵氏距离“、“切比雪夫距离“
什么是范数,及其对应的 "曼哈顿距离"."欧式距离"."闵氏距离"."切比雪夫距离" 一.什么是范数 二.欧式距离(对应 ...
- 数据的距离度量 一、欧式距离,曼哈顿距离,闵氏距离,切比雪夫距离,兰氏距离,马氏距离
数据的距离度量 一.欧式距离,曼哈顿距离,闵氏距离,切比雪夫距离,兰氏距离,马氏距离 前言 欧式距离 标准欧式距离 曼哈顿距离 闵氏距离 切比雪夫距离 兰氏距离 马氏距离 前言 本篇记录一下常用的数据 ...
- 曼哈顿距离和切比雪夫距离转换
设平面空间内存在两点,它们的坐标为(x1,y1) (x2,y2) 曼哈顿距离 dis=|x1−x2|+|y1−y2|,即两点横纵坐标差之和. 切比雪夫距离 dis=max(|x1−x2|,|y1−y2 ...
- 曼哈顿距离与切比雪夫距离及其相互转化
文章目录 曼哈顿距离与切比雪夫距离及其相互转化 1.算法分析 1.1 曼哈顿距离 1.2 切比雪夫距离 1.3 两者之间的关系 1.4 用处 2.典型例题 曼哈顿距离与切比雪夫距离及其相互转化 1.算 ...
- 【计几】曼哈顿距离与切比雪夫距离
讲解链接: 距离 OI Wiki 曼哈顿距离与切比雪夫距离:为何要相互转化 我们设 dM(A,B)d_M(A,B)dM(A,B) 为点 AAA 和点 BBB 的曼哈顿距离, dQ(A,B)d_Q(A ...
- 三维马氏距离_各种距离(欧氏距离、曼哈顿距离、切比雪夫距离、马氏距离等)...
引用:http://blog.csdn.net/shiwei408/article/details/7602324 在做分类时常常需要估算不同样本之间的相似性度量(SimilarityMeasurem ...
最新文章
- 目标检测coco数据集点滴介绍
- 怎样用python画雪花_python使用turtle库与random库绘制雪花
- 05用线程类Thread开启线程
- 为 Visual Studio 安装数据库工具
- mysql日期加减计算
- 解决The current branch is not configured for pull No value for key branch.master.merge found in config
- Java中各种整形类型可以表示的范围
- Spring boot 上传文件大小限制
- 每年扫码千亿次!微信官方开源了自家优化的二维码引擎!3行代码让你拥有微信扫码能力...
- 小米金融:与涉案的“山东小米金融服务外包有限公司”无关系
- 论文笔记_S2D.45_DeepVO: 基于深度循环卷积神经网络的端到端视觉里程计
- 通过数据,从键盘录入学生考试科目数,然后依次录入学的每一科分数.使用数组存储学生分数.然后输出总分,平均分,简单易理解
- 南山科技园的IDC机房怎么样?
- android应用跳文件管理,10款优秀Android文件管理器应用
- android投屏功能开发,Android DLNA投屏-基于CyberGarage开发投屏功能
- 从网络中获取债券收益率数据
- 微信开挂怎么防止封号_再也不怕被封号!微信养号秘笈教你防封号防降权
- Docker 部署微服务
- 微信小程序_在当前页面刷新数据 / 重载当前页面
- java ms932_Shift_JIS, MS932 and Unicode(收藏自网络)