先來看一下曼哈頓距離和切比雪夫距離的定義。(以下我可能用\(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 ...