洛咕 P3964 [TJOI2013]松鼠聚會
阿新 • • 發佈:2018-10-31
有個結論就是把座標\((x,y)\)變形成\(((x+y)/2,(x-y)/2)\),切比雪夫距離就變成了曼哈頓距離。
所以變換一下座標直接統計答案即可。
// luogu-judger-enable-o2 #include<bits/stdc++.h> #define il inline #define vd void typedef long long ll; il int gi(){ int x=0,f=1; char ch=getchar(); while(!isdigit(ch)){ if(ch=='-')f=-1; ch=getchar(); } while(isdigit(ch))x=x*10+ch-'0',ch=getchar(); return x*f; } struct yyb{ll x,y;}s[100010]; il bool operator <(const yyb&a,const yyb&b){return a.x<b.x;} ll Y[100010],sY[100010],sX[100010]; int main(){ #ifndef ONLINE_JUDGE freopen("3964.in","r",stdin); freopen("3964.out","w",stdout); #endif int n=gi(); for(int i=1;i<=n;++i){ int x=gi(),y=gi(); s[i].x=x+y,s[i].y=x-y; Y[i]=s[i].y; } std::sort(s+1,s+n+1); std::sort(Y+1,Y+n+1); for(int i=1;i<=n;++i)sY[i]=sY[i-1]+Y[i]; for(int i=1;i<=n;++i)sX[i]=sX[i-1]+s[i].x; ll ans=1e18; for(int i=1;i<=n;++i){ int p=std::lower_bound(Y+1,Y+n+1,s[i].y)-Y; ans=std::min(ans,-sX[i]*2+(i+i-n)*s[i].x+sX[n]-sY[p]*2+(p+p-n)*s[i].y+sY[n]); } printf("%lld\n",ans/2); return 0; }