1 条题解

  • 0
    @ 2026-9-23 0:38:14

    原题传送门

    Description\texttt{Description}

    找到两个点,使其曼哈顿距离最大。

    Solution\texttt{Solution}

    本题关键是化简曼哈顿距离的式子,对其分类讨论。

    ∣xi−xj∣+∣yi−yj∣|x_i-x_j|+|y_i-y_j|

    第一种情况:

    =(xi−xj)+(yi−yj)=(xi+yi)−(xj+yj)=(x_i-x_j)+(y_i-y_j)=(x_i+y_i)-(x_j+y_j)

    易得,最大值即为 max⁡xi+yi−min⁡xj+yj\max_{x_i+y_i}-\min_{x_j+y_j}。

    第二种情况:

    =(xi−xj)−(yi−yj)=(xi−yi)−(xj−yj)=(x_i-x_j)-(y_i-y_j)=(x_i-y_i)-(x_j-y_j)

    易得,最大值即为 max⁡xi−yi−min⁡xj−yj\max_{x_i-y_i}-\min_{x_j-y_j}。

    综上两种情况,我们求出

    $$\max_{x_i+y_i},\min_{x_j+y_j},\max_{x_i-y_i},\min_{x_j-y_j}$$

    即可求出答案。

    注意初始化时,需要将统计变量初始为极大值和极小值。

    Code\texttt{Code}

    #include<bits/stdc++.h>
    #define INF 0x7fffffff
    using namespace std;
    int main(){
    	int T;
    	scanf("%d",&T);
    	int a=-INF,b=-INF,c=INF,d=INF;
    	while(T--){
    		int x,y;
    		scanf("%d%d",&x,&y);
    		a=max(a,x+y);
    		b=max(b,x-y);
    		c=min(c,x+y);
    		d=min(d,x-y);
    	}
    	printf("%d",max(a-c,b-d));
    	return 0;
    }
    

    感谢观看。

    • 1

    信息

    ID
    2193
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    2
    已通过
    2
    上传者