結果

問題 No.2436 Min Diff Distance
ユーザー cho435
提出日時 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
権限があれば一括ダウンロードができます

ソースコード

diff #

#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;
}
0