これ!!!!!HUPC 2019 day2 セットで出したやつや!!!
問題概要
二次元平面上に 個の点 がある。
これらのうちの 2 点のマンハッタン距離として考えられる最大値を求めよ。
制約
考えたこと
2 点の位置関係としては、以下の 2 パターンがありうる。
最遠な 2 点の位置関係について考えてみると...
- 最遠な 2 点が、左のパターンだった場合は、 の最大値 と最小値 との差
- 最遠な 2 点が、右のパターンだった場合は、 の最大値 と最小値 との差
が答えになる。よって直感的には
が答えになりそうだ。このことをもう少し式変形ベースで示してみる。
式変形
絶対値に関する問題では
を利用すると見通しがよくなることがよくある。各組 に対して、 であるとしても一般性を失わず (逆であれば swap すればよい)、
と式変形できる。よって、
- 各 についての の最大値
- 各 についての の最大値
のうちの大きい方が答えとなる。以上から、上述の
が答えになることが確かめられた。計算量は となる。
コード
下のコードでは sort を使っているため、 になっている。
#include <bits/stdc++.h> using namespace std; int main() { int N; cin >> N; vector<long long> x(N), y(N), sum(N), sub(N); for (int i = 0; i < N; ++i) { cin >> x[i] >> y[i]; sum[i] = x[i] + y[i]; sub[i] = x[i] - y[i]; } sort(sum.begin(), sum.end()); sort(sub.begin(), sub.end()); cout << max(sum.back() - sum[0], sub.back() - sub[0]) << endl; }