题解 [USACO2004OPEN]洞穴里的牛之三
这道题目难度不是很大的,主要就是分类讨论。
题目意思
题目意思很简单,就是让你找出一对点对使得两点之间曼哈顿距离最大。
暴力大法
这道题目显然
暴力不能过。
正解
这道题目难就难在分类讨论:
我们已经知道原式为:
我们先来考虑几种情况:
当
以及
的时候,此时原式将会转换为:
。然后移项可得:
,要让这个柿子的结果尽量大,我们就要让
大,
尽量小,这个很好理解:更大的减去更小的才能更大。
当
以及
的时候,此时原式转换为:
此时我们像情况
一样,让
尽量小,
尽量大。
最后只要比较这两种情况谁大谁小就可以了:
,这样我们就将复杂度缩小到
。
代码实现
#include <bits/stdc++.h>
using namespace std;
const int maxn=5e4+5;
struct xjh {
int x,y;
} num[maxn];
int n,a,b=1e12,c,d=1e12;
inline int read() {
int sum=0,ff=1; char ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-') ff=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') {
sum=sum*10+ch-48;
ch=getchar();
}
return sum*ff;
}
int main() {
n=read();
for ( int i=1;i<=n;i++ ) {
num[i].x=read(),num[i].y=read();
a=max(a,num[i].x+num[i].y);
b=min(b,num[i].x+num[i].y);
c=max(c,num[i].x-num[i].y);
d=min(d,num[i].x-num[i].y);
}
printf("%d\n",max(a-b,c-d));
return 0;
} 