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