BZOJ 3210(花神的浇花集会-max(|x1-x2|,|y1-y2|)

3210: 花神的浇花集会

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 92  Solved: 50
[ Submit][ Status]

Description


在花老师的指导下,每周4都有一个集会活动,俗称“浇水”活动。

具体浇水活动详情请见BZOJ3153

但这不是重点

 

花神出了好多题,每道题都有两个参考系数:代码难度和算法难度

花神为了准备浇花集会的题,必须找一道尽量适合所有人的题

 

现在花神知道每个人的代码能力x和算法能力y,一道题(代码难度X算法难度Y)对这个人的不适合度为    Max ( abs ( X – x ) , abs ( Y – y ) )

 

也就是说无论太难还是太简单都会导致题目不适合做(如果全按花神本人能力设题,绝对的全场爆0的节奏,太简单,则体现不出花神的实力)

 

当然不是每次都如花神所愿,不一定有一道题适合所有人,所以要使所有人的不合适度总和尽可能低

 

花神出了100001*100001道题,每道题的代码难度和算法难度都为0,1,2,3,……,100000

 


Input

第一行一个正整数N,表示花神有N个学生,花神要为这N个学生选一道题

接下来N行,每行两个空格隔开的整数x[i],y[i],表示这个学生的代码能力和算法能力


Output

一个整数,表示最小的不合适度总和


Sample Input

3

1 2

2 1

3 3

Sample Output


3

HINT



对于100%的数据,n<=100000,0<=x[i],y[i]<=100000




Source

[ Submit][ Status]



反人类的曼哈顿距离变形

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

的逆变换


#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
#include<cmath>
#include<cctype>
#include<cassert>
#include<climits>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define RepD(i,n) for(int i=n;i>=0;i--)
#define MEM(a) memset(a,0,sizeof(a))
#define MEMI(a) memset(a,127,sizeof(a))
#define MEMi(a) memset(a,128,sizeof(a))
#define INF (10000000000+10)
#define F (1000000009)
#define MAXN (100000+10)
#define MAXXi (100000)
#define eps 1e-7
typedef long long ll;
int n,a[MAXN],b[MAXN],d[8][2]={{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,-1},{-1,1}};
double x[MAXN],y[MAXN];
ll calc(int mx,int my)
{
//	cout<<mx<<' '<<my<<endl;
	ll ans=0;
	For(i,n) ans+=max(abs(mx-a[i]),abs(my-b[i]));
	return ans;
}
int main()
{
//	freopen("bzoj3210.in","r",stdin);
	cin>>n;
	For(i,n)
	{
		scanf("%d%d",&a[i],&b[i]);
		x[i]=0.5*a[i]+0.5*b[i];
		y[i]=0.5*a[i]-0.5*b[i];
	}
	sort(x+1,x+1+n);sort(y+1,y+1+n);
	double mx=x[(1+n)/2],my=y[(1+n)/2];
	double mx2=mx+my,my2=mx-my;
	ll ans=calc(trunc(mx2),trunc(my2));
	Rep(i,8) 
	{
		ans=min(ans,calc(trunc(mx2+d[i][0]),trunc(my2+d[i][1]))); 
	}
	cout<<ans<<endl;
	return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值