切雪比夫距離
阿新 • • 發佈:2020-12-12
[TJOI2013]松鼠聚會
兩個點 \((x_1,y_1),(x_2,y_2)\) 的切雪比夫距離為:\(\max(|x_1-x_2|,|y_1-y_2|)\)。
這個東西非常不好處理,因為帶最值。
學習了轉換切雪比夫距離和曼哈頓距離的方法,而曼哈頓距離和是很好求的。
轉換公式為 \((x,y)\to (x+y,x-y)\),即可將曼哈頓距離轉換為切比雪夫距離。
\[|x_1-x_2|+|y_1-y_2|\ \ \& \ \ \max(|x_1+y_1-x_2-y_2|,|x_1-y_1-x_2+y_2|) \]右邊那個可以化成:
\[\max(|(x_1-x_2)+(y_1-y_2)|,|(x_1-x_2)-(y_1-y_2)|) \]會發現這個東西和左邊等價。
於是,證明成立。
那麼返回去倒退即可得到:
切雪比夫轉換為曼哈頓:\((x,y)\to (\frac{x+y}{2},\frac{x-y}{2})\)。
於是此題便可以得以解決。
#include <stdio.h> #include <algorithm> #define LL long long using namespace std; const int N=1e5+3; inline LL min(LL x,LL y){return x<y?x:y;} inline LL rin() { LL s=0; bool bj=false; char c=getchar(); for(;(c>'9'||c<'0')&&c!='-';c=getchar()); if(c=='-')bj=true,c=getchar(); for(;c>='0'&&c<='9';c=getchar())s=(s<<1)+(s<<3)+(c^'0'); if(bj)s=-s; return s; } LL s_x; LL s_y; struct gyq { LL x,y; LL sum; inline void init() { int x_=rin(),y_=rin(); x=x_+y_;y=x_-y_; s_x+=x;s_y+=y; return; } }a[N]; inline bool myru_x(gyq x,gyq y){return x.x<y.x;} inline bool myru_y(gyq x,gyq y){return x.y<y.y;} int main() { int i,j; int n=rin(); for(i=1;i<=n;i++)a[i].init(); LL sum; sort(a+1,a+n+1,myru_x); for(i=1,sum=0;i<=n;i++)sum+=a[i].x,a[i].sum+=a[i].x*i-sum+(s_x-sum)-a[i].x*(n-i); sort(a+1,a+n+1,myru_y); for(i=1,sum=0;i<=n;i++)sum+=a[i].y,a[i].sum+=a[i].y*i-sum+(s_y-sum)-a[i].y*(n-i); LL ans=0x3f3f3f3f3f3f3f3f; for(i=1;i<=n;i++)ans=min(ans,a[i].sum); printf("%lld\n",ans>>1); return 0; }