草原上住著一群小松鼠,每個小松鼠都有乙個家。時間長了,大家覺得應該聚一聚。但是草原非常大,松鼠們都很頭疼應該在誰家聚會才最合理。
每個小松鼠的家可以用乙個點x,y表示,兩個點的距離定義為點(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。
輸入格式:
第一行是乙個整數n,表示有多少只松鼠。接下來n行,第i行是兩個整數x和y,表示松鼠i的家的座標
輸出格式:
乙個整數,表示松鼠為了聚會走的路程和最小是多少。
輸入樣例#1:
6-4 -1
-1 -2
2 -4
0 20 3
5 -2
輸出樣例#1:
輸入樣例#2:
60 0
2 0-5 -2
2 -2
-1 2
4 0輸出樣例#2:
在第乙個樣例中,松鼠在第二隻松鼠家(-1,-2)聚會;在第二個樣例中,松鼠在第一只松鼠家(0.0)聚會。
30%的資料,0 ≤ n ≤ 1000
100%的資料,0 ≤ n ≤ 100000; −10^9 ≤ x, y ≤ 10^9
第一次聽說切比雪夫距離這個東西,它可以這樣與曼哈頓距離轉換。
將乙個點 (x,y) 的座標變為 \((x+y,x−y)\) 後,原座標系中的曼哈頓距離 = 新座標系中的切比雪夫距離
將乙個點 (x,y) 的座標變為 \((\frac,\frac)\) 後,原座標系中的切比雪夫距離 = 新座標系中的曼哈頓距離
於是我們把原座標系轉化一下,轉成更加熟悉的曼哈頓距離。
考慮列舉在哪只松鼠家聚會,聚會的路程為\(\sum|x_i-x|+|y_i-y|\),但是這樣絕對值很難處理。我們可以把x,y排序,然後查詢一下x,y位置,通過字首和處理一下就能快速算答案了。
為什麼最小的點答案都會超過1<<40???
然後順序加會long long,換一下加減法順序就過了???
#include#define lll long long
using namespace std;
lll read()
while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return x*w;
}const lll n=100010;
lll n,p,q,sx,sy,ans=(1ll<<62);
lll x[n],y[n],xx[n],yy[n],sumx[n],sumy[n];
lll check1(lll v)return l;
}lll check2(lll v)return l;
}int main()
sort(x+1,x+1+n);sort(y+1,y+1+n);
for(lll i=1;i<=n;i++)
sumx[i]=sumx[i-1]+x[i],sumy[i]=sumy[i-1]+y[i];
for(lll i=1;i<=n;i++)printf("%lld\n",ans/2);
}
TJOI2013 松鼠聚會
題目描述 草原上住著一群小松鼠,每個小松鼠都有乙個家。時間長了,大家覺得應該聚一聚。但是草原非常大,松鼠們都很頭疼應該在誰家聚會才最合理。每個小松鼠的家可以用乙個點x,y表示,兩個點的距離定義為點 x,y 和它周圍的8個點 x 1,y x 1,y x,y 1 x,y 1 x 1,y 1 x 1,y ...
雜題 Tjoi 2013 松鼠聚會
問題 f tjoi 2013 松鼠聚會 時間限制 1 sec 記憶體限制 128 mb 提交 70 解決 35 提交 狀態 討論版 題目描述 有n個小松鼠,它們的家用乙個點x,y表示,兩個點的距離定義為 點 x,y 和它周圍的8個點即上下左右四個點和對角的四個點,距離為1。現在n個松鼠要走到乙個松鼠...
3170 Tjoi 2013 松鼠聚會
題目鏈結 題目大意 給定平面上的n個點,求這n個點中的乙個點,使其到這n個點的切比雪夫距離之和最小 題解 根據結論 把座標系旋轉45 曼哈頓距離轉化成切比雪夫距離,把點 x y 變成 x y,x y 這樣新點之間的切比雪夫距離就是原點之間的曼哈頓距離 同理可以把切比雪夫距離轉化成曼哈頓距離,把點 x...