[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-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 2
 0 3
 5 -2
 輸出 #1復制
 20
 輸入 #2復制
 6
 0 0
 2 0
 -5 -2
 2 -2
 -1 2
 4 0
 輸出 #2復制
 15
 說明/提示
 樣例解釋
 在第一個樣例中,松鼠在第二只松鼠家(-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)的坐標變為(x+y2,x?y2) 后,原坐標系中的切比雪夫距離 = 新坐標系中的曼哈頓距離
然后題目給出了切比雪夫距離,我們變為曼哈頓距離,然后曼哈頓距離,x和y的計算是可以分開的,然后我們計算前綴和,就可以分別算出貢獻值了。
AC代碼:
#include<bits/stdc++.h> #define int long long using namespace std; const int N=1e5+10; int n,res=1e18,x[N],y[N],sx[N],sy[N]; struct node{int x,y;}t[N]; signed main(){cin>>n;for(int i=1;i<=n;i++){scanf("%lld %lld",&x[i],&y[i]); t[i].x=x[i]+y[i]; t[i].y=x[i]-y[i];x[i]=t[i].x; y[i]=t[i].y;}sort(x+1,x+1+n); sort(y+1,y+1+n);for(int i=1;i<=n;i++) sx[i]=x[i]+sx[i-1];for(int i=1;i<=n;i++) sy[i]=y[i]+sy[i-1];for(int i=1;i<=n;i++){int l=lower_bound(x+1,x+1+n,t[i].x)-x;int r=lower_bound(y+1,y+1+n,t[i].y)-y;int s=l*t[i].x-sx[l]+(sx[n]-sx[l]-(n-l)*t[i].x);s+=r*t[i].y-sy[r]+(sy[n]-sy[r]-(n-r)*t[i].y);res=min(res,s);}cout<<(res>>1ll)<<endl;return 0; }總結
以上是生活随笔為你收集整理的[TJOI2013]松鼠聚会的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 64行代码实现简单人脸识别
- 下一篇: CakePHP Pagination (
