题解 P3964 【[TJOI2013]松鼠聚会】
HiJ1m
2017-11-30 20:59:45
我的博客原文链接:http://www.cnblogs.com/Elfish/p/7931766.html
本题两点间的距离是max(|x1-x2|,|y1-y2|),曾经在黄学长的博客里看到过一个转化
求这个距离可以把点的坐标都转化成 (x+y)/2,(x-y)/2 然后的曼哈顿距离就是这个了
这个好像叫 切比雪夫距离
之后我们预处理前缀和,枚举源点就可以了。
记得都开longlong 我WA的很悲惨
```cpp
#include<bits/stdc++.h>
#define MAXN 100005
using namespace std;
int read(){
int x=0,t=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')t=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*t;
}
struct Node{
long long X,Y;
}a[MAXN];
int N,x[MAXN],y[MAXN],pos;
long long ans=1ll<<62,s1[MAXN],s2[MAXN];
int main()
{
N=read();
for(int i=1;i<=N;i++){
int p=read(),q=read();
x[i]=a[i].X=p+q;
y[i]=a[i].Y=p-q;
}
sort(x+1,x+N+1);
sort(y+1,y+N+1);
for(int i=1;i<=N;i++)
s1[i]=s1[i-1]+x[i],
s2[i]=s2[i-1]+y[i];
for(int i=1;i<=N;i++){
long long tmp=0;
pos=lower_bound(x+1,x+N+1,a[i].X)-x;
tmp+=s1[N]-s1[pos]-a[i].X*(N-pos)+a[i].X*pos-s1[pos];
pos=lower_bound(y+1,y+N+1,a[i].Y)-y;
tmp+=s2[N]-s2[pos]-a[i].Y*(N-pos)+a[i].Y*pos-s2[pos];
ans=min(ans,tmp);
}
printf("%lld\n",ans/2);
return 0;
}
```