数对的最大曼哈顿距离[ABC178E] Dist Max
[ABC178E] Dist Max
题面翻译
给定平面上 N N N 个点,求出所有点对间的最大曼哈顿距离。
题目描述
二次元平面上に $ N $ 個の点があり、$ i $ 番目の点の座標は $ (x_i,y_i) $ です。 同じ座標に複数の点があることもあります。 異なる二点間のマンハッタン距離として考えられる最大の値はいくつでしょうか。
ただし、二点 $ (x_i,y_i) $ と $ (x_j,y_j) $ のマンハッタン距離は $ |x_i-x_j|+|y_i-y_j| $ のことをいいます。
输入格式
入力は以下の形式で標準入力から与えられる。
$ N $ $ x_1 $ $ y_1 $ $ x_2 $ $ y_2 $ $ : $ $ x_N $ $ y_N $
输出格式
答えを出力せよ。
样例 #1
样例输入 #1
3
1 1
2 4
3 2
样例输出 #1
4
样例 #2
样例输入 #2
2
1 1
1 1
样例输出 #2
0
提示
制約
- $ 2\ \leq\ N\ \leq\ 2\ \times\ 10^5 $
- $ 1\ \leq\ x_i,y_i\ \leq\ 10^9 $
- 入力はすべて整数
Sample Explanation 1
$ 1 $ 番目の点と $ 2 $ 番目の点のマンハッタン距離は $ |1-2|+|1-4|=4 $ で、これが最大です。
思路:要 求两数对之间的曼哈顿距离,我们应该知道曼哈顿距离的公式为|xi - xj| + |yi - yj| , 分四种情况讨论后最后可以求得我们只用考虑两种情况:
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 2e6 + 10;
const int M = 1e9 + 7;
const int MOD = 998244353;
typedef long long ll;
typedef pair<ll,ll>PII;
typedef pair<double, double>PDD;int dx[] = {1, 1, -1, -1, 2, 2, -2, -2};
int dy[] = {2, -2, 2, -2, 1, -1, 1, -1};//曼哈顿距离化简绝对值之后最终可以化简为两种取最大的即可
PII p[N];
bool cmp1(PII a, PII b)
{return a.first + a.second < b.first + b.second;
}
bool cmp2(PII a, PII b)
{return a.first - a.second < b.first - b.second;
}
int main()
{int n;cin >> n;for(int i = 1; i <= n; i ++){cin >> p[i].first >> p[i].second;}sort(p + 1, p + 1 + n, cmp1);ll res = abs(p[n].second + p[n].first) - abs(p[1].first + p[1].second);sort(p + 1, p + 1 + n, cmp2);res = max(res, abs(p[n].first - p[n].second - (p[1].first - p[1].second)));cout << res << endl;return 0;
}