結果
| 問題 |
No.2436 Min Diff Distance
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-08-11 16:09:50 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 412 ms / 2,000 ms |
| コード長 | 2,260 bytes |
| コンパイル時間 | 1,977 ms |
| コンパイル使用メモリ | 211,716 KB |
| 最終ジャッジ日時 | 2025-02-16 00:42:53 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 23 |
ソースコード
#include <bits/stdc++.h>
#include <atcoder/segtree>
using namespace std;
using ll = long long;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
int op1(int a, int b) { return max(a, b); }
int op2(int a, int b) { return min(a, b); }
const int inf = 1e9;
int e1() { return -inf; }
int e2() { return inf; }
using maxsegtree = atcoder::segtree<int, op1, e1>;
using minsegtree = atcoder::segtree<int, op2, e2>;
int main() {
int N;
cin >> N;
vector<int> X(N), Y(N);
rep(i, N) {
cin >> X.at(i) >> Y.at(i);
X.at(i)--;
Y.at(i)--;
}
vector<int> p(N);
rep(i, N) p.at(i) = i;
sort(p.begin(), p.end(), [&](int a, int b) {
if (X.at(a) == X.at(b)) return Y.at(a) < Y.at(b);
return X.at(a) < X.at(b);
});
vector<int> dist_min(N, inf), dist_max(N, -inf);
maxsegtree mxa(N), mxb(N);
minsegtree mna(N), mnb(N);
for (int i : p) {
dist_min.at(i) =
min(dist_min.at(i), (X.at(i) + Y.at(i)) - mxa.prod(0, Y.at(i)));
dist_min.at(i) =
min(dist_min.at(i), (X.at(i) - Y.at(i)) - mxb.prod(Y.at(i), N));
dist_max.at(i) =
max(dist_max.at(i), (X.at(i) + Y.at(i)) - mna.prod(0, Y.at(i)));
dist_max.at(i) =
max(dist_max.at(i), (X.at(i) - Y.at(i)) - mnb.prod(Y.at(i), N));
mxa.set(Y.at(i), X.at(i) + Y.at(i));
if(mna.get(Y.at(i)) > X.at(i) + Y.at(i)) mna.set(Y.at(i), X.at(i) + Y.at(i));
mxb.set(Y.at(i), X.at(i) - Y.at(i));
if(mnb.get(Y.at(i)) > X.at(i) - Y.at(i)) mnb.set(Y.at(i), X.at(i) - Y.at(i));
}
reverse(p.begin(), p.end());
mxa = maxsegtree(N), mxb = maxsegtree(N);
mna = minsegtree(N), mnb = minsegtree(N);
for (int i : p) {
dist_min.at(i) =
min(dist_min.at(i), mna.prod(Y.at(i), N) - (X.at(i) + Y.at(i)));
dist_min.at(i) =
min(dist_min.at(i), mnb.prod(0, Y.at(i)) - (X.at(i) - Y.at(i)));
dist_max.at(i) =
max(dist_max.at(i), mxa.prod(Y.at(i), N) - (X.at(i) + Y.at(i)));
dist_max.at(i) =
max(dist_max.at(i), mxb.prod(0, Y.at(i)) - (X.at(i) - Y.at(i)));
if(mxa.get(Y.at(i)) < X.at(i) + Y.at(i)) mxa.set(Y.at(i), X.at(i) + Y.at(i));
mna.set(Y.at(i), X.at(i) + Y.at(i));
if(mxb.get(Y.at(i)) < X.at(i) - Y.at(i)) mxb.set(Y.at(i), X.at(i) - Y.at(i));
mnb.set(Y.at(i), X.at(i) - Y.at(i));
}
int ans = inf;
rep(i, N) ans = min(ans, dist_max.at(i) - dist_min.at(i));
cout << ans << endl;
}