跳轉到

平面距離

介紹

  • 歐幾里德:\(\sqrt{(x_i - x_j)^2 + (y_i - y_j)^2}\)

  • 曼哈頓(計程車幾何):\(|x_i - x_j| + |y_i - y_j|\)

  • 切比雪夫:\(\max(|x_i - x_j|, |y_i - y_j|)\)

轉換

先來看圖

Image title

  • 曼哈頓 ⇒ 切比雪夫

    • \((x,y)\Rightarrow (x+y,x-y)\)

    • 原本座標的曼哈頓距離 = 新座標中的切比雪夫距離

  • 切比雪夫 ⇒ 曼哈頓

    • \((x,y)\Rightarrow (\frac{x+y}{2},\frac{x-y}{2})\)

    • 原本座標的切比雪夫距離 = 新座標中的曼哈頓距離

例題

IOI 2007 Pairs

有一個盤面大小為 \(m\),給 \(n\)\(B\) 座標點 \(p_i\),問有幾對 \((i,j)\) 使曼哈頓距離 \(dis(p_i,p_j)\) 不超過 \(D\)

\(B\in \{1,2,3\}, n\le 10^5,m\le \{7.5\times 10^7, 7.5\times 10^4, 75\}\)

思路

一維: two pointer

二維: sweep line

  • (x-d, y) ⇒ +1

  • (x, y) ⇒ query[y-d, y+d]

  • (x+d, y) ⇒ -1

三維: m^2 枚舉 z,變二維的問題,注意自己會算到自己,所以答案要減 n

JOI 2023 Advertisement 2

一維座標上,有 \(n\) 個點,第 \(i\) 個點在 \(x_i\),影響力為 \(e_i\)。若選擇一個點 \(i\),能覆蓋點 \(j\) 若且唯若 \(|x_i-x_j| \le e_i - e_j\),問最少要選幾個點才能使所有點都被覆蓋

\(n\le 5\times 10^5, 1\le x_i, e_i\le 10^9\)

思路

想成在二維座標平面上的點 \((x_i, e_i)\),會發現要選的區域恰好是

Image title

轉 45 度後,問題就變成,有選的點會覆蓋左下,至少要選幾個點才能使全部被覆蓋。會發現答案就是從 x 左往右看過去 y 座標遞減的一些點,可用單調 stack 維護

Image title

2023 YTP 13_結束樂團出遊!(Kessoku_Band_at_Enoshima)

\(n\) 個二維座標點,點跟點之間的距離為曼哈頓距離,有 \(q\) 筆操作:

  • \(\text{query}(x,y):\) 問離 \((x,y)\) 最近的點的距離

  • \(\text{insert}(x,y):\)\((x,y)\) 上加入一個新的點

\(n,q\le 3\times 10^5, |x|,|y| \le 5\times 10^4\)

思路

沒有 insert 的 subtask:

假如目前的點是 \(j\),答案在 \(i\),考慮 \(|x_i-x_j|+|y_i-y_j|\),假如 \(x_i \ge x_j\)\(y_i \ge y_j\),那麼其實可以看成 \((x_i+y_i)-(x_j+y_j)\),所以可以用掃描線,每個點的權值設為 \((x_i+y_i)\) 即可。

題解: https://hackmd.io/IiUWbMv1TNq07XBxTuXibA?view#Kessoku-Band-at-Enoshima