原题链接:https://atcoder.jp/contests/abc178/tasks/abc178_e
题目大意:
给出
n
n
n个点的坐标,求出其中最大的两点之间曼哈顿距离。
曼哈顿距离:
∣
x
i
−
x
j
∣
+
∣
y
i
−
y
j
∣
\left|x_{i}-x_{j}\right|+\left|y_{i}-y_{j}\right|
∣xi−xj∣+∣yi−yj∣
解题思路:
对于公式
∣
x
i
−
x
j
∣
+
∣
y
i
−
y
j
∣
\left|x_{i}-x_{j}\right|+\left|y_{i}-y_{j}\right|
∣xi−xj∣+∣yi−yj∣可以进行转化,转化为
m
a
x
(
∣
x
i
−
x
j
+
y
i
−
y
j
∣
,
∣
x
i
−
x
j
−
y
i
+
y
j
∣
)
max( | x_i - x_j + y_i - y_j|, |x_i - x_j - y_i + y_j|)
max(∣xi−xj+yi−yj∣,∣xi−xj−yi+yj∣),其转化过程就是考虑
x
i
−
x
j
x_i - x_j
xi−xj与
y
i
−
y
j
y_i - y_j
yi−yj的正负取值。进一步转化:
max
(
∣
(
x
i
+
y
i
)
−
(
x
j
+
y
j
)
∣
,
∣
(
x
i
−
y
i
)
−
(
x
j
−
y
j
)
∣
)
\max (|(x_i+y_i)-(x_j+y_j)|,|(x_i-y_i)-(x_j-y_j)|)
max(∣(xi+yi)−(xj+yj)∣,∣(xi−yi)−(xj−yj)∣)。最后排序最大减最小即可。
code:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pi;
typedef complex <double> cp;
#define debug(a) cout<<#a<<":"<<a<<endl;
#define fr freopen("in.txt","r",stdin);
#define Fill(x,a) memset(x,a,sizeof(x))
#define cpy(a,b) memcpy(a,b,sizeof(a))
const double PI = acos(-1);
const int INF=0x3f3f3f3f;
const int N=1e6+7;
const int mod=1e9+7;
int maxn,minn;
int T,n,m,q;
int x[N];
int y[N];
int a[N],b[N];
int main(){
cin >> n;
for(int i = 1; i <= n; i ++ ){
scanf("%d%d", x + i, y + i);
a[i] = x[i] + y[i];
b[i] = x[i] - y[i];
}
sort(a + 1, a + n + 1);
sort(b + 1, b + n + 1);
cout << max(a[n] - a[1], b[n] - b[1]) << endl;
return 0;
}