2388 首都(曼哈頓距離與切比雪夫距離互轉)

2021-09-28 21:33:22 字數 1628 閱讀 6627

在平面上有n個整點(橫縱座標都是整數)

牛牛想找到乙個整點,使得這個點,到所有點的距離之和最小。

兩個點的距離定義為從乙個點走到另乙個點的最小步數。

其中每步可以走向相鄰8個點(上,下,左,右,左上,左下,右上,右下,類似西洋棋中的王)走一步。

輸出這個最小的距離之和。

和這個點選擇的方案數。(即有多少個點,可以達到這個最小的距離)

對於100%的資料,1 <= n <= 100000,|x|, |y| <= 1000000000

對於40%的資料,1 <= n <= 100,|x|, |y| <= 100

對於以上每部分資料,都有50%的資料n是奇數。

注意資料範圍是x和y的絕對值,x和y可以是負數。

輸入第一行乙個整數n

接下來n行,每行兩個整數x, y。描述乙個點。

輸出第一行輸出最小的距離之和。

第二行輸出有多少個點,可以達到這個最小距離。

輸入樣例

42 1

1 20 1

1 0輸出樣例45

曼哈頓距離與切比雪夫距離及其相互轉

語法知識:

n&1:

當n為奇數:1

當n為偶數:0

n^1:

當n為奇數:n-1

當n為偶數:n+1

(n&1)^1:

當n為奇數:0

當n為偶數:1

#includeusing namespace std;

#define ll long long

#define n 100005

int n;

//小寫x,y為曼哈頓距離,大寫為切比雪夫距離

ll sum[2][2],ans,dis,x[n],y[n],x[n],y[n],_x,_y;

int dir[4][2]=,,

,};int main()

//sort

(x+1,x+n+1)

;sort

(y+1,y+n+1)

; ll a=x[(n+1)/2],b=x[(n+2)/2];

if(a==b)

sum[0][a&1]=1;

else

a=y[(n+1)/2];b=y[(n+2)/2];

if(a==b)

sum[1][a&1]=1;

else

//ans=sum[0][0]*sum[1][0]+sum[0][1]*sum[1][1];

if(ans==0)

else if

(dis==dis)

ans++;

dis=0;

} cout<<(dis/2)

<<"\n"

<;

return 0;

} _x=x[(n+1)/2];

_y=y[(n+1)/2];

if(_x+_y&1)

for(int i=1;i<=n;i++)

dis+=abs

(x[i]-_x)+abs

(y[i]-_y)

; cout<<(dis/2)

<<"\n"

<;

return 0;

}

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

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

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

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

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

曼哈頓距離和切比雪夫距離 兩個點的距離定義為點 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 ...