結果
| 問題 | No.3759 Watch Fireworks |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-10-28 15:35:31 |
| 言語 | C++23 (gcc 15.3.0 + boost 1.92.0 + ACL) |
| 結果 |
AC
不安定
|
| 実行時間 | 128 ms / 2,000 ms |
| + 392µs | |
| コード長 | 2,079 bytes |
| 記録 | |
| コンパイル時間 | 2,590 ms |
| コンパイル使用メモリ | 334,412 KB |
| 実行使用メモリ | 8,064 KB |
| 最終ジャッジ日時 | 2026-10-28 15:35:53 |
| 合計ジャッジ時間 | 6,166 ms |
|
ジャッジサーバーID (参考情報) |
judge3_0 / judge5_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 46 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
vector<pair<ll,ll>> P(n);
ll minU = LLONG_MAX, maxU = LLONG_MIN;
ll minV = LLONG_MAX, maxV = LLONG_MIN;
for (int i = 0; i < n; i++) {
ll x, y;
cin >> x >> y;
ll u = x + y;
ll v = x - y;
P[i] = {u, v};
minU = min(minU, u);
maxU = max(maxU, u);
minV = min(minV, v);
maxV = max(maxV, v);
}
// 一辺 m の正方形2個で覆えるか
auto check = [&](ll m) -> bool {
// 1人目の正方形を四隅に配置
for (int a = 0; a < 2; a++) {
for (int b = 0; b < 2; b++) {
ll leftU = (a == 0 ? minU : maxU - m);
ll leftV = (b == 0 ? minV : maxV - m);
// 1人目が担当できない点の範囲
ll loU = LLONG_MAX, hiU = LLONG_MIN;
ll loV = LLONG_MAX, hiV = LLONG_MIN;
for (auto [u, v] : P) {
// 1人目が担当できる
if (leftU <= u && u <= leftU + m &&
leftV <= v && v <= leftV + m) {
continue;
}
// 2人目が担当する点
loU = min(loU, u);
hiU = max(hiU, u);
loV = min(loV, v);
hiV = max(hiV, v);
}
// 残りが0点
if (loU == LLONG_MAX) return true;
// 残りが一辺 m の正方形に収まる
if (hiU - loU <= m &&
hiV - loV <= m) {
return true;
}
}
}
return false;
};
// 答えの二分探索
ll l = -1;
ll r = max(maxU - minU, maxV - minV);
while (r - l > 1) {
ll m = l + (r - l) / 2;
if (check(m)) r = m;
else l = m;
}
cout << r << '\n';
}