曼哈頓距離和切比雪夫距離轉化

2022-05-11 04:20:07 字數 1584 閱讀 2066

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

兩個點的距離定義為點 \((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 但是 因為 ...