1012 曼哈頓距離 切比雪夫距離

2021-08-28 23:53:49 字數 1491 閱讀 1837

什麼是切比雪夫距離?什麼是曼哈頓距離?

傻傻分不清,沒關係,看:

曼哈頓距離設平面空間內存在兩點,它們的座標為(x1,y1),(x2,y2)

則dis=|x1−x2|+|y1−y2|

即兩點橫縱座標差之和

切比雪夫距離

設平面空間內存在兩點,它們的座標為(x1,y1),(x2,y2)

則dis=max(|x1−x2|,|y1−y2|)

即兩點橫縱座標差的最大值

比如這個圖,a,b兩點的曼哈頓距離就是

切比雪夫距離就是

既然都提到這兩個距離了,就免不了要講講它們的相互轉化

將乙個點(x,y)的座標變為(x+y,x−y)後,原座標系中的曼哈頓距離 = 新座標系中的切比雪夫距離

將乙個點(x,y)的座標變為

這個證明也很容易,有興趣的同學可以來皮一下

我就不在這裡贅述了

然而有什麼用呢??這麼多奇奇怪怪的定義,真是讓人摸不著頭腦

但事實上,可有用了呢

切比雪夫距離由於要求max 很多時候不是很好優化,對於乙個點,計算其他點到該的距離的複雜度為o(n)(因為要列舉)

而曼哈頓距離只有求和以及取絕對值兩種運算,我們把座標排序後可以去掉絕對值的影響,進而用字首和優化,可以把複雜度降為o(1),也可以支援很多次的運算

而有乙個細節需要注意一下:

在切比雪夫距離轉曼哈頓距離的時候,座標本是要除以2的,但考慮到精度的問題,我們一般都會將除以2 這一步操作放到最後

這樣也是正確的,形象的理解可以說成,曼哈頓座標系是通過切比雪夫座標系旋轉45度後,再縮小到原來的一半得到的。

是不是手癢癢了??來吧,練一道入門題 松鼠聚會(tjoi 2013)

#include#define ll long long 

#define n 100009

#define in read()

using namespace std;

inline int read()

return f==1?res:-res;

}ll ans=1ll<<50ll,sumx[n],sumy[n];//一開始ans又初始小了~~~~~悲傷

int n,x[n],y[n],xx[n],yy[n];

ll solve(int now)

int main()

sort(xx+1,xx+n+1);

sort(yy+1,yy+n+1);

for(i=1;i<=n;++i)

for(i=1;i<=n;++i)

ans=min(ans,solve(i));

cout<

return 0;

}

總結 曼哈頓距離轉切比雪夫距離

我們在用二維樹狀陣列的時候,可以得到乙個邊與座標軸平行的矩形內點集的資訊。如果我們需要得到得到到乙個點的距離小於等於k的點的資訊呢。這些點構成的不在是邊也座標軸平行的矩形,而是乙個對角線與座標軸平行的菱形。可以通過轉化,使得整個座標軸旋轉45 然後我們菱形變成了方方正正的矩形,又可以用而二維樹狀陣列...

曼哈頓距離和切比雪夫距離轉化

曼哈頓距離和切比雪夫距離 兩個點的距離定義為點 x,y 和它周圍的 8 個點 x 1,y x 1,y x,y 1 x,y 1 x 1,y 1 x 1,y 1 x 1,y 1 x 1,y 1 距離為 1 用下 gyx 學長的圖 切比雪夫距離 dis max delta x,delta y delta ...

松鼠搬家 切比雪夫距離 到 曼哈頓距離

題意 求切比雪夫距離 直接求不好求,可以轉化成曼哈頓距離 切比雪夫 d max x 1 x 2 y 1 y 2 曼哈頓距離 d x 1 x 2 y 1 y 2 d 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 ...