题面

传送门

题解

对于两个点\((x_i,y_i)\)和\(x_j,y_j\),我们定义它们之间的曼哈顿距离为

\[|x_i-x_j|+|y_i-y_j|
\]

定义它们的切比雪夫距离为

\[\max(|x_i-x_j|,|y_i-y_j|)
\]

有如下转换:

将原坐标为\((x,y)\)的点转化为\((x+y,x-y)\)之后,原坐标系中的曼哈顿距离等于新坐标系中的切比雪夫距离

将原坐标为\((x,y)\)的点转化为\(({x+y\over 2},{x-y\over 2})\)之后,原坐标系中的切比雪夫距离等于新坐标系中的曼哈顿距离

这里只证后一个,因为前一个就是它反过来

证明:

首先我们有一个结论

\[\max\left({|a+b|,|a-b|}\right)=|a|+|b|
\]

分类讨论就能证明了

那么两个点重构之后的坐标为\(({x_i+y_i\over 2},{x_i-y_i\over 2}),({x_j+y_j\over 2},{x_j-y_j\over 2})\),设为\((x_i',y_i'),(x_j',y_j')\),那么现在它们之间的距离为

\[\begin{aligned}
Ans
&=\max(|x_i-x_j|,|y_i-y_j|)\\
&=\max(|(x_i'+y_i')-(x_j'+y_j')|,|(x_i'-y_i')-(x_j'-y_j')|)\\
&=\max(|(x_i'-x_j')+(y_i'-y_j')|,|(x_i'-x_j')-(y_i'-y_j')|)\\
&=|x_i'-x_j'|+|y_i'-y_j'|
\end{aligned}
\]

然后这题把切比雪夫距离转化为曼哈顿距离就可以了

关于如何计算曼哈顿距离的和呢?我们可以按\(x\)坐标和\(y\)坐标排个序,前缀和搞一下就可以了,具体可以看代码

//minamoto
#include<bits/stdc++.h>
#define R register
#define ll long long
#define inline __inline__ __attribute__((always_inline))
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
const int N=1e5+5;
ll sum[N],res,tmp;int x[N],y[N],n;
struct node{
int v,id;
inline node(){}
inline node(R int vv,R int ii):v(vv),id(ii){}
inline bool operator <(const node &b)const{return v<b.v;}
}p[N];
int main(){
// freopen("testdata.in","r",stdin);
n=read(),res=1e18;
for(R int i=1,dx,dy;i<=n;++i)dx=read(),dy=read(),x[i]=dx+dy,y[i]=dx-dy;
fp(i,1,n)p[i]=node(x[i],i);
sort(p+1,p+1+n);
tmp=0;
fp(i,1,n)sum[p[i].id]+=1ll*(i-1)*p[i].v-tmp,tmp+=p[i].v;
tmp=0;
fd(i,n,1)sum[p[i].id]+=tmp-1ll*(n-i)*p[i].v,tmp+=p[i].v;
fp(i,1,n)p[i]=node(y[i],i);
sort(p+1,p+1+n);
tmp=0;
fp(i,1,n)sum[p[i].id]+=1ll*(i-1)*p[i].v-tmp,tmp+=p[i].v;
tmp=0;
fd(i,n,1)sum[p[i].id]+=tmp-1ll*(n-i)*p[i].v,tmp+=p[i].v;
fp(i,1,n)cmin(res,sum[i]);
printf("%lld\n",res>>1);
return 0;
}

最新文章

  1. linux-----------shell的基础命令
  2. Animo.js :一款管理 CSS 动画的强大的小工具
  3. MVVM小记
  4. CSS position relative absolute fixed
  5. 【原】《Git教程》学习笔记
  6. java四大域总结
  7. ADO.NET EF实体框架
  8. Sql语句中的truncate,delete,drop的区别
  9. uva 11992 - Fast Matrix Operations
  10. nORA-01000: 超出打开游标的最大数(SDE连接)
  11. Android的读写文件权限
  12. 依据道路的shape获得high_cross和low_cross
  13. HTML5原生拖拽/拖放⎡Drag &amp; Drop⎦详解
  14. ajax错误处理 500错误
  15. nginx报错zero size shared memory zone one
  16. Codeforces.392E.Deleting Substrings(区间DP)
  17. kubernetes的Controller Manager
  18. 【PAT】1032 Sharing (25)(25 分)
  19. Spring接受前台的数据超过256出现如下异常:
  20. 【点击模型学习笔记】Modeling contextual factors of click rates_MS_AAAI2007

热门文章

  1. FORALL用法小结
  2. 迷你MVVM框架 avalonjs 0.83发布
  3. Jmeter Http接口性能测试
  4. python之with...as
  5. Python:如何排序(sort)
  6. 创建Kafka0.8.2生产者与消费者
  7. Golang基本结构之练习(day2)
  8. code3286 火柴排队
  9. qt QTcpServer与QTcpSocket通讯
  10. MySql 8小时解决方案:proxool连接池