2017.9.22 松鼠的聚会 失败总结

来源:互联网 发布:oral b软件 编辑:程序博客网 时间:2024/04/27 21:10

首先切比雪夫距离是不支持离散的,所以想要排序on的算法必须将其转成可以离散的计算方法

。。这个题要求的是切比雪夫距离和、、而他竟然可以转化成曼哈顿距离、


曼哈顿距离:  max(y-yy+x-xx,y-yy+xx-x,yy-y+x-xx,yy-y+xx-x )

切比雪夫距离:max(y-yy,xx-x,yy-y,x-xx)


然后观察二式特点,设 x=x+y  y=x-y,,带入曼哈顿距离中,就变成了和下面一样的、、(这个姑且算套路吧,因为常人除了枚举很难推出来)


然后就直接前缀和后缀和移动搞搞就好了、、


注意:这题竟然紧卡long long,mdzz调了一个小时、,所以ans初值除非设的极大,不然就老老实实的赋值吧、


码:

#include<iostream>#include<cstdio>#include<algorithm>using namespace std;#define N 100005#define ll long longstruct la{ll x,y,id;}a[N];ll qsum[N],hsum[N],qsum2[N],hsum2[N],qgs[N],qgs2[N],hgs[N],hgs2[N],ans,n,i;bool cmp(la a,la b){return a.x<b.x;}bool cmp2(la a,la b){return a.y<b.y;}int main(){scanf("%lld",&n);if(n==0){printf("0");return 0;}for(i=1;i<=n;i++){int l1,l2;scanf("%d%d",&l1,&l2);a[i].x=l1+l2;a[i].y=l1-l2;a[i].id=i;}sort(a+1,a+1+n,cmp);for(i=1;i<=n;i++){qgs[a[i].id]+=qgs[a[i-1].id]+1;    qsum[a[i].id]+=qgs[a[i-1].id]*(a[i].x-a[i-1].x)+qsum[a[i-1].id];}for(i=n;i>=1;i--){hgs[a[i].id]+=hgs[a[i+1].id]+1;    hsum[a[i].id]+=hgs[a[i+1].id]*(a[i+1].x-a[i].x)+hsum[a[i+1].id];}sort(a+1,a+1+n,cmp2);for(i=1;i<=n;i++){qgs2[a[i].id]+=qgs2[a[i-1].id]+1;    qsum2[a[i].id]+=qgs2[a[i-1].id]*(a[i].y-a[i-1].y)+qsum2[a[i-1].id];}for(i=n;i>=1;i--){hgs2[a[i].id]+=hgs2[a[i+1].id]+1;    hsum2[a[i].id]+=hgs2[a[i+1].id]*(a[i+1].y-a[i].y)+hsum2[a[i+1].id];}ans=qsum[1]+hsum[1]+qsum2[1]+hsum2[1];for(i=2;i<=n;i++){ans=min(ans,qsum[i]+hsum[i]+qsum2[i]+hsum2[i]);}printf("%lld",ans/2);}