曼哈頓距離與切比雪夫距離的親密 關係。

2022-05-07 20:33:10 字數 1432 閱讀 2062

先來看一下曼哈頓距離和切比雪夫距離的定義。(以下我可能用\(d_m,d_q\)來表示兩者)

曼哈頓距離:\(|x_1-x_2|+|y_1-y_2|\)

切比雪夫距離:\(max(|x_1-x_2|,|y_1-y_2|)\)

至於為什麼說他倆關係♂,就是因為他們可以相互轉化!

轉換關係如下:當座標為\((x,y)\)時

\(d_m=\)座標為\((x+y,x-y)\)時的\(d_q\)

\(d_q=\)座標為\((\dfrac,\dfrac)\)時的\(d_q\)

經過向\(itst\)神仙詢問,將其區分開來:

\(d_m\)常用於求和,而\(d_q\)常用於\(max,min\)

而其中的絕對值,可以用排序去掉。

\(luogup2906cow neighborhoods\)

做法:現將曼哈頓距離轉化為切比雪夫,排序,列舉每個點,刪掉\(x\)的差已經大於\(c\)的點。

再用\(set\)維護新\(y_i\)(及點的編號),找到第乙個滿足條件的點後就**,在判斷前乙個是否滿足,**。

群的關係用並查集維護就好了。

#includeusing namespace std;

#define int long long

inline int read()

while(x!=eof&&x>='0'&&x<='9')

return w*f;

}const int n=100010;

int n,fa[n],c,l=1,cnt[n],ansx,ans;

pairp[n];

set> s;

inline int find(int x)

main()

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

for(int i=1;i<=n;i++) ansx=max(ansx,cnt[i]);

printf("%lld %lld",ans,ansx);

}

\(luogu[tjoi2013]\)松鼠聚會

做法:將切比雪夫轉曼哈頓,推公式,列舉聚會地點即可(當然還要排序

#includeusing namespace std;

#define int long long

inline int read()

while(x!=eof&&x>='0'&&x<='9')

return w*f;

}const int n=100010;

int n,x[n],y[n],ans=1ll<<62,sx[n],sy[n],px[n],py[n];

main()

printf("%lld",ans/2);

}

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

什麼是切比雪夫距離?什麼是曼哈頓距離?傻傻分不清,沒關係,看 曼哈頓距離設平面空間內存在兩點,它們的座標為 x1,y1 x2,y2 則dis x1 x2 y1 y2 即兩點橫縱座標差之和 切比雪夫距離 設平面空間內存在兩點,它們的座標為 x1,y1 x2,y2 則dis max x1 x2 y1 y...

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

我們在用二維樹狀陣列的時候,可以得到乙個邊與座標軸平行的矩形內點集的資訊。如果我們需要得到得到到乙個點的距離小於等於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 ...