BZOJ P3170: [Tjoi 2013]松鼠聚会

直接坐标转化之后,前缀和过掉

#include<iostream>
#include<fstream>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
struct node{
	long long a,b;
	int id;
}p[500003];
int n,i,x,y;
long long ans,lx[500003],ly[500003],rx[500003],ry[500003];
bool cmpx(const node& x,const node& y){
	return x.a<y.a;
}
bool cmpy(const node& x,const node & y){
	return x.b<y.b;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>x>>y;
		p[i].a=x-y;
		p[i].b=x+y;
		p[i].id=i;
	}
	sort(p+1,p+n+1,cmpx);
	for(int i=1;i<=n;i++){
		lx[p[i].id]=lx[p[i-1].id]+(p[i].a-p[i-1].a)*(i-1);
	}
	for(int i=n;i>=1;i--){
		ly[p[i].id]=ly[p[i+1].id]+(p[i+1].a-p[i].a)*(n-i);
	}
	sort(p+1,p+n+1,cmpy);
	for(int i=1;i<=n;i++){
		rx[p[i].id]=rx[p[i-1].id]+(p[i].b-p[i-1].b)*(i-1);
	}
	for(int i=n;i>=1;i--){
		ry[p[i].id]=ry[p[i+1].id]+(p[i+1].b-p[i].b)*(n-i);
	}
	ans=1e16;
	for(int i=1;i<=n;i++){
		ans=min(ans,lx[i]+ly[i]+rx[i]+ry[i]);
	}
	cout<<ans/2;
	return 0;
}
/*
in:
6
-4 -1
-1 -2
2 -4
0 2
0 3
5 -2
out:
20
*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值