题解 P5098 【[USACO2004OPEN]Cave Cows 3 洞穴里的牛之三】

· · 题解

这道题目难度不是很大的,主要就是分类讨论。

1.1题目意思

题目意思很简单,就是让你找出一对点对使得两点之间曼哈顿距离最大。

2.1暴力大法

这道题目(N<=5e4)显然O(n^2)暴力不能过。

3.1正解

这道题目难就难在分类讨论:

我们已经知道原式为:|xi-xj|+|yi-yj|

我们先来考虑几种情况:

$B.$当$xi<xj$以及$yi>yj$的时候,此时原式转换为:$-(xi-yi)+(xj-yj)$此时我们像情况$A$一样,让$xi-yi$尽量小,$xj-yj$尽量大。 最后只要比较$A,B$这两种情况谁大谁小就可以了:$ans=max(a-b,c-d)$,这样我们就将复杂度缩小到$O(n)$。 ### $4.1$代码实现 ```cpp #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; } ```