曼哈顿距离
若有点 A ( x 1 , y 1 ) A(x_1,y_1) A(x1,y1)和 B ( x 2 , y 2 ) B(x_2,y_2) B(x2,y2),则 A , B A,B A,B两点的曼哈顿距离为 ∣ x 1 − x 2 ∣ + ∣ y 1 − y 2 ∣ |x_1-x_2|+|y_1-y_2| ∣x1−x2∣+∣y1−y2∣。
若要求 n n n个点两两之间的曼哈顿距离之和,因为 x x x的贡献和 y y y的贡献是分开的,所以我们可以分别处理。
将 n n n个点的 x x x和 y y y分别排序,用前缀和来求解。时间复杂度为 O ( n log n ) O(n\log n) O(nlogn)。
切比雪夫距离
曼哈顿距离可以理解为每次可以向上、下、左、右四个方向中的一个方向走一步,从一点走到另一点的的最小步数。
则切比雪夫距离就是可以向八个方向中的一个方向走一步,从一点走到另一点的的最小步数。
若有点 A ( x 1 , y 1 ) A(x_1,y_1) A(x1,y1)和 B ( x 2 , y 2 ) B(x_2,y_2) B(x2,y2),则 A , B A,B A,B两点的切比雪夫距离为 max ( ∣ x 1 − x 2 ∣ , ∣ y 1 − y 2 ∣ ) \max(|x_1-x_2|,|y_1-y_2|) max(∣x1−x2∣,∣y1−y2∣)。
若要求 n n n个点两两之间的切比雪夫距离之和,因为 x x x的贡献和 y y y的贡献不是独立的,所以好像只能一个个枚举,用 O ( n 2 ) O(n^2) O(n2)的时间复杂度来求解。
难道真的没有更快的做法吗?
优化
我们可以将原坐标系上的点逆时针旋转 4 5 ∘ 45^{\circ} 45∘,则 A ( x 1 , y 1 ) A(x_1,y_1) A(x1,y1)在旋转后的坐标为 ( x A , y A ) (x_A,y_A) (xA,yA)
x A = x 1 cos 4 5 ∘ − y 1 sin 4 5 ∘ = 2 2 ( x 1 − y 1 ) x_A=x_1\cos 45^{\circ}-y_1\sin 45^{\circ}=\dfrac{\sqrt 2}{2}(x_1-y_1) xA=x1cos45∘−y1sin45∘=22(x1−y1)
y A = x 1 sin 4 5 ∘ + y 1 cos 4 5 ∘ = 2 2 ( x 1 + y 1 ) y_A=x_1\sin 45^{\circ}+y_1\cos 45^{\circ}=\dfrac{\sqrt 2}{2}(x_1+y_1) yA=x1sin45∘+y1cos45∘=22(x1+y1)
再将点到原点的距离放大到原来的 2 \sqrt 2 2倍,得 x A = x 1 − y 1 , y A = x 1 + y 1 x_A=x_1-y_1,y_A=x_1+y_1 xA=x1−y1,yA=x1+y1
同理, B ( x 2 , y 2 ) B(x_2,y_2) B(x2,y2)通过上述转换后的坐标为 B ′ ( x B , y B ) B'(x_B,y_B) B′(xB,yB), x B = x 2 − y 2 , y B = x 2 + y 2 x_B=x_2-y_2,y_B=x_2+y_2 xB=x2−y2,yB=x2+y2
A , B A,B A,B的切比雪夫距离为 max ( ∣ x 1 − x 2 ∣ , ∣ y 1 − y 2 ∣ ) \max(|x_1-x_2|,|y_1-y_2|) max(∣x1−x2∣,∣y1−y2∣)
A
′
,
B
′
A',B'
A′,B′的曼哈顿距离为
∣
x
A
−
x
B
∣
+
∣
y
A
−
y
B
∣
=
∣
(
x
1
−
y
1
)
−
(
x
2
−
y
2
)
∣
+
∣
(
x
1
+
y
1
)
−
(
x
2
+
y
2
)
∣
|x_A-x_B|+|y_A-y_B|=|(x_1-y_1)-(x_2-y_2)|+|(x_1+y_1)-(x_2+y_2)|
∣xA−xB∣+∣yA−yB∣=∣(x1−y1)−(x2−y2)∣+∣(x1+y1)−(x2+y2)∣
=
∣
(
x
1
−
x
2
)
−
(
y
1
−
y
2
)
∣
+
∣
(
x
1
−
x
2
)
+
(
y
1
−
y
2
)
∣
\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad =|(x_1-x_2)-(y_1-y_2)|+|(x_1-x_2)+(y_1-y_2)|
=∣(x1−x2)−(y1−y2)∣+∣(x1−x2)+(y1−y2)∣
令 t x = x 1 − x 2 , t y = y 1 − y 2 t_x=x_1-x_2,t_y=y_1-y_2 tx=x1−x2,ty=y1−y2
A , B A,B A,B的切比雪夫距离为 max ( ∣ t x ∣ , ∣ t y ∣ ) \max(|t_x|,|t_y|) max(∣tx∣,∣ty∣), A ′ , B ′ A',B' A′,B′的曼哈顿距离为 ∣ t x − t y ∣ + ∣ t x + t y ∣ |t_x-t_y|+|t_x+t_y| ∣tx−ty∣+∣tx+ty∣
- 若 t x > 0 , t y > 0 t_x>0,t_y>0 tx>0,ty>0, ∣ t x − t y ∣ + ∣ t x + t y ∣ |t_x-t_y|+|t_x+t_y| ∣tx−ty∣+∣tx+ty∣在 t x > t y t_x>t_y tx>ty时为 2 t x 2t_x 2tx,在 t x < t y t_x<t_y tx<ty时为 2 t y 2t_y 2ty
- 若 t x > 0 , t y < 0 t_x>0,t_y<0 tx>0,ty<0, ∣ t x − t y ∣ + ∣ t x + t y ∣ |t_x-t_y|+|t_x+t_y| ∣tx−ty∣+∣tx+ty∣在 t x > − t y t_x>-t_y tx>−ty时为 2 t x 2t_x 2tx,在 t x < − t y t_x<-t_y tx<−ty时为 − 2 t y -2t_y −2ty
- 若 t x < 0 , t y > 0 t_x<0,t_y>0 tx<0,ty>0, ∣ t x − t y ∣ + ∣ t x + t y ∣ |t_x-t_y|+|t_x+t_y| ∣tx−ty∣+∣tx+ty∣在 − t x > t y -t_x>t_y −tx>ty时为 − 2 t x -2t_x −2tx,在 − t x < t y -t_x<t_y −tx<ty时为 2 t y 2t_y 2ty
- 若 t x < 0 , t y < 0 t_x<0,t_y<0 tx<0,ty<0, ∣ t x − t y ∣ + ∣ t x + t y ∣ |t_x-t_y|+|t_x+t_y| ∣tx−ty∣+∣tx+ty∣在 − t x > − t y -t_x>-t_y −tx>−ty时为 − 2 t x -2t_x −2tx,在 − t x < − t y -t_x<-t_y −tx<−ty时为 − 2 t y -2t_y −2ty
经过分类讨论,我们发现 A ′ , B ′ A',B' A′,B′的曼哈顿距离为 A , B A,B A,B的切比雪夫距离的两倍。由此可得,在求 n n n个点两两之间的切比雪夫距离之和时,将每个点逆时针旋转 4 5 ∘ 45^{\circ} 45∘在放大到原来的 2 \sqrt 2 2倍,求新的点的曼哈顿距离,在除以2即为原来 n n n个点的切比雪夫距离。
这样求 n n n个点两两之间的切比雪夫距离,时间复杂度为 O ( n log n ) O(n\log n) O(nlogn)。