若點 \(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 然後我們菱形變成了方方正正的矩形,又可以用而二維樹狀陣列...