3170: [Tjoi 2013]松鼠聚会 (中位数)

对于这题,我们可以得到d(i,j)=max(|xi-xj|,|yi-yj|),
设x'=(x+y)/2,y'=(x-y)/2
那么d(i,j)=|xi'-xj'|+|yi'-yj'|
x,y轴可以分开统计
先是统计x轴,将所有松鼠的x'排序
用前缀和和后缀和求出某个松鼠到其他松鼠的X轴距离
Xi*(i-1)-sum(1..i-1)+sum(i+1..n)-(n-i)*Xi
y轴同理
#include<iostream>
#include<cstdio>
#include<algorithm>
#define N 100005
#define ll long long
using namespace std;
int n;
struct point{ll x,y;int num;}a[N];
double ans=1e20;
ll sx,sy,ax[N],bx[N],ay[N],by[N];
bool cmpx(point a,point b){return a.x<b.x;}
bool cmpy(point a,point b){return a.y<b.y;}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
	   ll x,y;
	   scanf("%lld%lld",&x,&y);
	   a[i].x=x+y;a[i].y=x-y;
    }
	sort(a+1,a+n+1,cmpy);
	for(int i=1;i<=n;i++)
	{
		ay[i]=ay[i-1]+a[i].y;
		by[n-i+1]=by[n-i+2]-a[n-i+1].y;
		a[i].num=i;
	}
	sort(a+1,a+n+1,cmpx);
	for(int i=1;i<=n;i++)
	{
		ax[i]=ax[i-1]+a[i].x;
		bx[n-i+1]=bx[n-i+2]-a[n-i+1].x;
	}
	for(int i=1;i<=n;i++)
    {
        ll tmp=0;
        tmp+=ax[n]-ax[i]-(n-i)*(ax[i]-ax[i-1]);
        tmp+=bx[1]-bx[i]-(i-1)*(bx[i]-bx[i+1]);
        int j=a[i].num;
        tmp+=ay[n]-ay[j]-(n-j)*(ay[j]-ay[j-1]);
        tmp+=by[1]-by[j]-(j-1)*(by[j]-by[j+1]);
        if(tmp<ans)ans=tmp;
    }
    printf("%.0lf",ans/2);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值