結果

問題 No.2436 Min Diff Distance
ユーザー cho435cho435
提出日時 2023-08-11 16:09:50
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 571 ms / 2,000 ms
コード長 2,260 bytes
コンパイル時間 2,494 ms
コンパイル使用メモリ 216,864 KB
実行使用メモリ 18,360 KB
最終ジャッジ日時 2024-04-29 12:21:35
合計ジャッジ時間 10,873 ms
ジャッジサーバーID
(参考情報)
judge5 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
5,248 KB
testcase_01 AC 1 ms
5,376 KB
testcase_02 AC 2 ms
5,376 KB
testcase_03 AC 561 ms
18,232 KB
testcase_04 AC 553 ms
18,232 KB
testcase_05 AC 543 ms
18,360 KB
testcase_06 AC 561 ms
18,232 KB
testcase_07 AC 569 ms
18,228 KB
testcase_08 AC 567 ms
18,232 KB
testcase_09 AC 2 ms
5,376 KB
testcase_10 AC 2 ms
5,376 KB
testcase_11 AC 345 ms
18,236 KB
testcase_12 AC 217 ms
18,232 KB
testcase_13 AC 346 ms
16,740 KB
testcase_14 AC 43 ms
5,376 KB
testcase_15 AC 571 ms
18,088 KB
testcase_16 AC 221 ms
10,792 KB
testcase_17 AC 475 ms
17,536 KB
testcase_18 AC 429 ms
17,176 KB
testcase_19 AC 491 ms
17,652 KB
testcase_20 AC 305 ms
11,440 KB
testcase_21 AC 112 ms
7,168 KB
testcase_22 AC 44 ms
5,376 KB
権限があれば一括ダウンロードができます

ソースコード

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