「CodeForces - 50C 」Happy Farm 5 (几何)

时间:2023-02-10 20:03:10

BUPT 2017 summer training (16) #2B

题意

有一些二维直角坐标系上的整数坐标的点,找出严格包含这些点的只能八个方向走出来步数最少的路径,输出最少步数。

题解

这题要求严格包含的路径。实际上答案就是不严格包含的+4步。
也可以加上每个点上下左右的四个点再跑凸包。
最少步数就是凸包上相邻两点的\(max(\Delta x,\Delta y)\)之和。
其实这题也可以不求凸包,用平行于对角线的四条边非严格包含地去围这些点,若相交的地方不在格点上,我们四边都往外扩展后,也是+4步就得到严格包含的路径。
然后因为斜着一步和水平的一步是等价的,所以步数其实就是四边形路径的x差值*2加4。
设a=max(x+y),c=min(x+y),b=max(x-y),d=min(x-y)。四条边分别是x+y=a,x+y=c,x-y=b,x-y=d。
然后求出四个交点的最大的x就是(a+b)/2,最小的x就是(c+d)/2
于是x差值*2就是((a+b)/2-(c+d)/2)*2=a+b-c-d

代码

#include <cstdio>
#include <algorithm>
#define inf 0x3f3f3f3f
using namespace std;
int main(){
    int n,a,b,c,d;
    a=b=-inf;c=d=inf;
    scanf("%d",&n);
    for(int i=1,x,y;i<=n;++i){
        scanf("%d%d",&x,&y);
        a=max(x+y,a);
        b=max(x-y,b);
        c=min(x+y,c);
        d=min(x-y,d);
    }
    printf("%d",a+b-c-d+4);
    return 0;
}