在平面上有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 ...