HDU Meeting point-1 曼哈顿距离

链接戳

暴力吧……大概?

为了减轻暴力的负担,稍微处理一下,并不复杂

对于某两点间的曼哈顿距离,dis=abs(x1-x2)+abs(y1-y2)

这里点很多很多,很容易想到,为了简化处理,可以利用前缀和,然后我们就需要想办法处理一下绝对值的问题

如果我们对两点间的大小进行排序,就可以把绝对值去掉啦

对横纵坐标分别排序,分别求 sumx[i]=i*x[i]-pre_sumx[i-1]+pre_sumx[n]-prex_sumx[i]-(n-i)*x[i];

                                                sumy[i]=i*y[i]-pre_sumy[i-1]+pre_sumy[n]-pre_sumy[i]-(n-i)*y[i];

然后暴力扫一遍,记录i为中心时的最小sumx[i]+sumy[i]

虽然为了处理横纵坐标前缀和的问题是分开考虑,但是最后结果的处理不是,所以用结构体保存一下横纵坐标和sumx(sumy)就可以了

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAX= 1e5+5;
ll t,n,presumx[MAX],presumy[MAX];
struct pos
{
    ll x,y,mark;
}p[MAX];
bool cmpx(pos a,pos b)
{
    if(a.x==b.x)
      return a.y<b.y;
    return a.x<b.x;
}
bool cmpy(pos a,pos b)
{
    if(a.y==b.y)
      return a.x<b.x;
    return a.y<b.y;
}
int main()
{
  cin>>t;
  while(t--)
  {
      cin>>n;
      ll ans=1e18;
      presumx[0]=0,presumy[0]=0;
      for(int i=1;i<=n;i++)
      cin>>p[i].x>>p[i].y;
      sort(p+1,p+n+1,cmpx);
      for(int i=1;i<=n;i++)
       presumx[i]=presumx[i-1]+p[i].x;
      for(int i=1;i<=n;i++)
      {
       ll tempx=p[i].x*(i-1)-presumx[i-1]+presumx[n]-presumx[i]-p[i].x*(n-i);
       p[i].mark=tempx;
      }
      sort(p+1,p+1+n,cmpy);
      for(int i=1;i<=n;i++)
       presumy[i]=presumy[i-1]+p[i].y;    
      for(int i=1;i<=n;i++)
      {
       ll tempy=p[i].y*(i-1)-presumy[i-1]+presumy[n]-presumy[i]-p[i].y*(n-i);
      ans=min(ans,p[i].mark+tempy);    
      }
    cout<<ans<<endl;
 }
 return 0;       
} 

 

转载于:https://www.cnblogs.com/Egoist-/p/8196116.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值