切比雪夫距离

定义

设二维平面中的两点 \(A(x_1,y_1)\)\(B(x_2,y_2)\),定义它们之间的切比雪夫距离为

\[d(A,B)=\max\{|x_1-x_2|,|y_1-y_2|\} \]

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

思考一下两者的联系。

\(A\)\(B\) 的曼哈顿距离:

\[d(A,B)=|x_1-x_2|+|y_1+y_2| \]

\[=\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\} \]

\[=\max\{|(x_1+y_1)-(x_2+y_2)|,|(x_1-y_1)-(x_2-y_2)|\} \]

这是 \((x_1+y_1,x_1-y_1)\)\((x_2+y_2,x_2-y_2)\) 的切比雪夫距离。

这说明切比雪夫坐标系是由曼哈顿坐标系旋转 \(45^{\circ}\) 后放大一倍得到的。同理:

  • 曼哈顿坐标系是通过切比雪夫坐标系旋转 \(45^\circ\) 后再缩小为一半得到的。

\(A\)\(B\) 的切比雪夫距离:

\[d(A,B)=\max\{|x_1-x_2|,|y_1-y_2|\} \]

\[=|\frac{x_1+y_1}{2}-\frac{x_2+y_2}{2}|+|\frac{x_1-y_1}{2}-\frac{x_2-y_2}{2}| \]

上面这个式子的正确性值得思考一下。

这是 \((\frac{x_1+y_1}{2},\frac{x_1-y_1}{2})\)\((\frac{x_2+y_2}{2},\frac{x_2-y_2}{2})\) 的曼哈顿距离。

两者的相互转化

  • 曼哈顿距离 \(\rightarrow\) 切比雪夫距离:\((x,y)\rightarrow(x+y,x-y)\)

  • 切比雪夫距离 \(\rightarrow\) 曼哈顿距离:\((x,y)\rightarrow(\frac{x+y}{2},\frac{x-y}{2})\)

可惜的是在 \(D\ge 3\) 的时候切比雪夫距离不能转化为曼哈顿距离。


题目

P4648 [IOI2007] pairs 动物对数

给定 \(B\) 维曼哈顿坐标系上的 \(n\) 个整点,问满足 \(i<j,dis(i,j)\le D\)\((i,j)\) 总数。

\(1\le B\le 3\)\(n\le 10^5\)\(D\le 10^8\).


保证点的坐标为正整数。记 \(m\) 为最大的坐标值。

  • \(B=1\)\(m\le 7.5\times 10^7\).

  • \(B=2\)\(m\le 7.5\times 10^4\).

  • \(B=3\)\(m\le 75\).


  • \(B=1\)

双指针维护一下即可。时间复杂度 \(O(n)\).

  • \(B=2\)

先曼转切,令 \((x,y)\leftarrow(x+y,x-y)\).

直观的来说就是对每个 \((x,y)\) 求左上角为 \((x-D,y-D)\),右下角为 \((x+D,y+D)\) 的子矩阵和 \(-1\).

\(x\) 为关键字排序,记录双指针 \(i,j\),用树状数组维护。

偏移量设为 \(m\) 即可。时间复杂度 \(O(n\log m)\).

  • \(B=3\)

曼哈顿坐标系上的点可以转化为一个四元组,但是写起来太麻烦了。

不妨对 \(m=75\) 这个限制做一些暴力。

\((x,y,z)\) 的前二维曼转切,视为 \(z\) 平面上的点。

对于每个点 \((x_i,y_i,z_i)\),枚举另一个点的 \(z_j\),即求 \(z_j\) 平面上,左上角为 \((x_i-l,y_i-l)\),右下角为 \((x_i+l,y_i+l)\) 的子矩阵和 \(-[z_i=z_j]\).

对每个平面计算其二维前缀和,时间复杂度 \(O(m^3+nm)\).

此时计算的点对总数应 \(/2\).

record


P3964 [TJOI2013] 松鼠聚会

给出切比雪夫坐标系上的 \(n\) 个整点,找到一个点满足其与其他点的总距离最小,输出这个值。

\(n\le 10^5\)\(|x|,|y|\le 10^9\).


切转曼,对于点 \(j\),求和式即

\[\sum_{i=1}^{n}|x_i-x_j|+|y_i-y_j| \]

只考虑 \(x\),可以拆成

\[\sum_{i=1}^{j}(x_j-x_i)+\sum_{i=j+1}^{n}(x_i-x_j) \]

容易发现就是前缀和。时间复杂度 \(O(n\log n)\).

record


P2906 [USACO08OPEN] Cow Neighborhoods G

对曼哈顿坐标系上距离 \(\le C\) 的点对连边,问总连通块数与最大块的大小。

\(n\le 10^5\)\(1\le C,x_i,y_i\le 10^9\).


曼转切后点对连边即 \(\max(|x_1-x_2|,|y_1-y_2|)\le C\).

\(x_i,y_i\) 分别为第一、二关键字从小到大排序。

用 set 维护 \(y_i\) 的值,插入 \(i\) 是先删除所有 \(|x_i-x_j|>C\)\(y_j\),在 set 里找到第一个 \(\ge y_i\) 的点,若合法将它们合并,同理可以找到第一个 \(\le y_i\) 的点将它们并 merge 起来。

这样做容易发现 \(y_i\) 会按照大小顺序不断合并,时间复杂度 \(O(n\alpha(n)+n\log n)\).

record


P8075 [COCI2009-2010#7] KRALJEVI

求出 \(n\times m\) 的网格中若干点之间的切比雪夫距离之和。

\(n,m\le 10^3\).


直接使用松鼠聚会的方法即可,最后将答案 \(/2\),也就是应该 \(/4\).

时间复杂度 \(O(n^2\log^2 n)\).

record


P3439 [POI2006] MAG-Warehouse

给定若干三元组 \((x,y,t)\),表示 \((x,y)\) 处有 \(t\) 个点,求一个整点,最小化到这 \(\sum t_i\) 个点的切比雪夫距离。

输出横纵坐标最大的那个。

\(n\le 10^5\)\(1\le x,y\le 5\times 10^8\)\(1\le t\le 10^6\).


切转曼后对 \(x\)\(y\) 分别取中位数 \(mid\) 即可。

最后要将坐标转换回来,不妨把 \(mid-1,mid,mid+1\) 的值全部计算一次。

record


[ABC233Ex] Manhattan Christmas Tree

给出曼哈顿坐标系上的 \(n\) 个整点。

\(q\) 次询问,每次询问与 \((a_i,b_i)\) 与离它第 \(k_i\) 近的点的距离。

\(1\le k_i\le n\le 10^5\)\(1\le q\le 10^5\)\(0\le x_i,y_i\le 10^5\).


曼转切。

\(x\) 构建主席树不断插入 \(y\),二分答案值,在主席树上跑即可。

\(y\) 的值域应为 \(\rm [-1e5,1e5]\),加上偏移量。

record


Four Coloring

\(n\times m\) 的网格用 RYGB 上色,使得曼哈顿距离为 \(d\) 的格子颜色不同。

\(n,m\le 500\)\(1\le d\le n+m-2\).


\[|x_1-y_1|+|x_2-y_2|=d \]

\[\max{(x_1+y_1)-(x_2+y_2),(x_1-y_1)-(x_2-y_2)}=d \]

在切比雪夫坐标系上应为若干斜着的 \(d\times d\) 的正方形,单个正方形内的点互不影响,相邻的正方形染上不同的颜色可以视为合法的方案。

然后发现这个东西跟奇偶性有关。

所以在原网格上,把每个点曼转切,判断它在所在的块行列的奇偶性,有 \(4\) 种情况,分别用 RYGB 覆盖即可。

record


[ARC065E] へんなコンパス

给出曼哈顿坐标系上的 \(n\) 个点,有一个指南针指向其中的两个点,状态记为 \(P(a,b)\).(无序点对)

若点 \(x\) 满足 \(dis(a,x)=dis(a,b)\),指南针的状态可以变为 \(P(a,x)\),对于 \(b\) 同理。

问指南针共有多少不同的状态。

\(n\le 10^5\)\(1\le x_i,y_i\le 10^9\).


在曼哈顿坐标系上,每次的转移都是一个斜着的正方形,不是很好做。

曼转切,那么能转移应有:

\[\begin{cases}|x_1-x_2|=dis\\|y_1-y_2|\le dis\end{cases} \]

或者

\[\begin{cases}|y_1-y_2|=dis\\|x_1-x_2|\le dis\end{cases} \]

对各点排序后容易二分查找,要减掉两个都为 \(dis\) 的情况。

考虑统计答案,对于合法点对将两点连边。

得到合法区间后,将该区间内的点两两相连并向 \((x_a,y_a)\) 连边。

维护每个点的出度,与初始点 \(a\) 连通的即为合法方案。

record


P6526 「Wdoi-1」四重存在

在平面直角坐标系上支持如下操作:

  • 新增点 \(i\)(下标从 \(1\) 开始),用 \((x_i,y_i,v_i)\) 表示。
  • 查询两点间的距离最大值
  • 查询忽略某个点后两点间的距离最大值

同时定义 \(u,v\) 间的距离 \(\operatorname{dis}(u,v)=|x_u-x_v|+|y_u-y_v|+v_{\max(u,v)}\)

\(q\le 2\times 10^6\),值域 \([-10^8,10^8]\)强制在线


在不断加点的过程中维护要求的东西。

转为切比雪夫距离,令 \((x,y)\rightarrow(x+y,x-y)\),钦定 \(a<b\),则 \(\operatorname{dis}(a,b)=\max(|x_a-x_b|,|y_a-y_b|)+v_b\)

\(b\) 固定时,最大化 \(\operatorname{dis}(a,b)\)\(a\) 一定满足 \(x_a\)\(y_a\) 取全局极值或次极值。

于是加点的时候,在四个方向上可以维护出八个点的信息。

如果 \(x\not=a\)\(x\not=b\),那么 \((a,b)\) 可以对 \(x\in[1,a-1]\cup[a+1,b-1]\cup[b+1,n]\) 处的答案形成 \(\operatorname{dis}(a,b)\) 的贡献。发现有用的 \((a,b)\) 数量是 \(O(n)\) 的,线段树即可。

时间复杂度 \(O(n\log n)\)

record

posted @ 2023-08-23 22:07  SError  阅读(239)  评论(1编辑  收藏  举报