您的位置:首页 > 其它

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

2013-06-27 08:35 288 查看

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

mjmjmj命题Stilwell制作数据

[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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: