TJOI2013 松鼠聚會(列舉)

2022-04-30 09:30:10 字數 1699 閱讀 4128

草原上住著一群小松鼠,每個小松鼠都有乙個家。時間長了,大家覺得應該聚一聚。但是草原非常大,松鼠們都很頭疼應該在誰家聚會才最合理。

每個小松鼠的家可以用乙個點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...