切比雪夫距離

2022-10-09 13:54:12 字數 1583 閱讀 7537

若點 \(a(x_1,y_1),b(x_2,y_2)\) 則兩點間的曼哈頓距離為 \(|x_1-x_2|+|y_1-y_2|\)

已知 \(n\) 個點求兩兩之間的曼哈頓距離之和,易得 \(x\) 的貢獻與 \(y\) 的貢獻是分開的

可以用兩次排序去絕對值 + 字首和解決

複雜度 \(o(n\log n)\)

曼哈頓距離是 4 向移動的最少步數,切比雪夫距離則是 8 向移動最少步數

即對於 \(a(x_1,y_1),b(x_2,y_2)\) 兩點的切比雪夫距離為 \(\max(|x_1-x_2|,|y_1-y_2|)\)

問題:給定 \(n\) 個點,求兩兩之間的切比雪夫距離之和

此時 \(x,y\) 的貢獻不能單獨算了,怎麼辦?

將原座標系逆時針旋轉 \(45^\) ,再放大 \(\sqrt\) 倍

會發現:此(座標系中的曼哈頓距離)是(原座標系中切比雪夫距離)的 2 倍

考慮 \((x_1,y_1)\) 旋轉後的座標 \((x_2,y_2)\)

\(x_2=x_1\cos 45^-y_1\sin 45^=\dfrac}(x_1-y_1)\)

\(y_2=y_1\cos 45^+x_1\sin 45^=\dfrac}(x_1+y_1)\)

放大了 \(\sqrt\) 倍,所以 \(x_2=x_1-y_1,y_2=x_1+y_1\)

轉換成曼哈頓距離,同樣 \(o(n\log n)\) 求,最後除以 2

給乙個 \(n\times m\) 的棋盤,兩個玩家有's''m'兩種國王,國王八向移動

傳播值定義為玩家國王兩兩之間距離和,要分別求兩個玩家的傳播值

板子(確信)

#include using namespace std;

typedef unsigned long long ull;

typedef long double ld;

typedef long long ll;

typedef double db;

const int n = 1005;

int n, m, tot;

struct poi a[n * n];

ll tt, sm;

char mp[n][n];

inline bool cmp1(poi a, poi b)

inline bool cmp2(poi a, poi b)

inline void sol(char ch) ;

sort(a + 1, a + tot + 1, cmp1);

sm = tt = 0;

for (int i = 1; i <= tot; i++) sm += a[i].x * (i - 1) - tt, tt += a[i].x;

sort(a + 1, a + tot + 1, cmp2), tt = 0;

for (int i = 1; i <= tot; i++) sm += a[i].y * (i - 1) - tt, tt += a[i].y;

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

}int main()

切比雪夫距離

切比雪夫距離是什麼呢?假設有兩個點,a x,y b m,n 那麼這兩個點的切比雪夫距離就是max x m y n 然而它有什麼卵用嗎?我也不知道 然而它可以轉化為曼哈頓距離,這就非常6了.用了乙個非常神奇的思想.我們把座標系順時針旋轉45 這個點到原點的距離是固定的,然後我們用和角公式,這個點的座標...

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

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

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

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