曼哈頓距離和切比雪夫距離
兩個點的距離定義為點 \((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 x\)為兩個點距離橫座標差絕對值
將\((x,y)\)座標變為\((x+y,x-y)\)後,原座標系曼哈頓距離\(=\)新座標系切比雪夫距離
曼哈頓距離\(|x_1-x_2|+|y_1-y_2|\),可以表示成
\[max\
\]考慮變\((x1,y1),(x2,y2)\) 為 \((x1+y1,x1-y1)(x2+y2,y2-y2)\)
切比雪夫距離為\(\max\\)
兩點曼哈頓距離加絕對值可表示為上面的切比雪夫距離
將\((x,y)\)座標變為\(\large(\frac2,\frac2)\)後,原座標切比雪夫距離\(=\)新座標曼哈頓距離
p3964 tjoi2013 松鼠聚會
給你\(n\)個點,選乙個點使這個點到其他點切比雪夫距離之和最小
列舉每個距離匹配,暴力是\(n^2\)的
把切比雪夫距離轉換成曼哈頓距離,橫縱座標分開求,只寫橫座標了,另乙個同理
令座標有序
\[\delta x(1,i)+\delta x(2,i)+...\delta x(n,i)\\
=|x_i-x_1|+|x_i-x_2|...+|x_i-x_n|\\
=(x_i-x_1)+...+(x_i-x_i)+(x_-x_i)+...+(x_n-x_i)\\
=(i*x_i-\sum_^ix_k)+(\sum_^nx_k-(n-i)*x_i)\\
\]字首和優化
const ull max = 0x7777777777777f;
int n,x[n],y[n],gx[n],gy[n];
ull sumx[n],sumy[n];
inline ull calc(int i)
int main()
sort(gx + 1,gx + n + 1);
for(int i = 1;i <= n;++i)
sumx[i] = sumx[i-1] + gx[i];
sort(gy + 1,gy + n + 1);
for(int i = 1;i <= n;++i)
sumy[i] = sumy[i-1] + gy[i];
ull res = max;
for(int i = 1;i <= n;++i)
res = std::min(res,calc(i));
printf("%llu",res >> 1ll);
}
\(max\)能開多大開多大,建議開ull_ma 1012 曼哈頓距離 切比雪夫距離
什麼是切比雪夫距離?什麼是曼哈頓距離?傻傻分不清,沒關係,看 曼哈頓距離設平面空間內存在兩點,它們的座標為 x1,y1 x2,y2 則dis x1 x2 y1 y2 即兩點橫縱座標差之和 切比雪夫距離 設平面空間內存在兩點,它們的座標為 x1,y1 x2,y2 則dis max x1 x2 y1 y...
總結 曼哈頓距離轉切比雪夫距離
我們在用二維樹狀陣列的時候,可以得到乙個邊與座標軸平行的矩形內點集的資訊。如果我們需要得到得到到乙個點的距離小於等於k的點的資訊呢。這些點構成的不在是邊也座標軸平行的矩形,而是乙個對角線與座標軸平行的菱形。可以通過轉化,使得整個座標軸旋轉45 然後我們菱形變成了方方正正的矩形,又可以用而二維樹狀陣列...
HDU 4312 切比雪夫轉化 曼哈頓距離
題目大意 從給出的點中 選出乙個點作為中心 求別的點距這個點的最小距離的和。思路 根據題意 可以知道 切比雪夫 d i max xi x y yi 曼哈頓距離 d i y2 y1 x2 x1 然後就是從切比雪夫轉化曼哈頓形式,座標逆時針旋轉 45度 即x1 x0 y0 y1 x0 y0 但是 因為 ...