HDOJ  4312   Meeting point-2

来源:互联网 发布:js 按字母排序 编辑:程序博客网 时间:2024/06/14 04:34

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4312

题解报告;

平面上两点间的 Chebyshev距离为 max(|x1-x2|, |y1-y2|)

HDOJ <wbr> <wbr>4312 <wbr> <wbr> <wbr>Meeting <wbr>point-2

这和上一道题差不多

求max(|x1-x2|, |y1-y2|)

怎么样才能将这一道题转化为上一道求解,

2*max(|x1-x2|,|y1-y2|)=|x1-x2-(y1-y2)|+|x1-x2+(y1-y2)|=|(x1-y1)-(x2-y2)|+|(x1-y1)+(x2+y2)|

上一题解的是  平面上两点间的 Manhattan 距离为 |x1-x2| +|y1-y2|

来那个这相比较

可以将x1=x1-y1,x2=x2-y2;y1=x1-y1,y2=x2+y2;对待

所以将上一题的答案改一下就好

#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
typedef long long ll;
const int MAXN = 100100;
struct Point{
    int x,y;
   Point(){}
    Point(int_x, int _y):x(_x),y(_y){}
}ary[MAXN];
int x[MAXN], y[MAXN];
ll sx[MAXN], sy[MAXN];
int main()
{
    int T,n;
   scanf("%d",&T);
   while(T--)
    {
       scanf("%d",&n);
       for(int i = 0; i < n; ++i)
       {
           scanf("%d%d",&x[i],&y[i]);
           ary[i] =Point(x[i]-y[i],x[i]+y[i]);       //改动
           x[i]=ary[i].x,y[i]=ary[i].y;       //改动
       }
       sort(x, x + n);
       sort(y, y + n);
       sx[0] = x[0];
       sy[0] = y[0];
       for(int i = 1; i < n; ++i)
       {
           sx[i] = sx[i - 1] + x[i];
           sy[i] = sy[i - 1] + y[i];
       }
       ll ans = 1;
       ans <<= 60;
       for(int i = 0; i < n; ++i)
       {
           int rankx = lower_bound(x, x + n, ary[i].x) - x;
           int ranky = lower_bound(y, y + n, ary[i].y) - y;
           ll t = ll(ary[i].x) * (rankx + 1) - sx[rankx]

               +sx[n - 1] - sx[rankx] - ll(ary[i].x) * (n - rankx - 1);
           t += ll(ary[i].y) * (ranky + 1) - sy[ranky]

                 +sy[n- 1] - sy[ranky] - ll(ary[i].y) * (n - ranky - 1);
           ans = min(ans, t);
       }
       cout<<ans/2<<endl;
    }
    return0;
}

     

0 0