
配点: 300 点 / 実行時間制限: 2 sec / メモリ制限: 1024 MB / Difficulty: 259 / NoviSteps: 3Q
問題概要
のグリッドがあり、このグリッドの上から
番目、左から
番目のマスをマス
と表す。
グリッド上には 人の人がおり、はじめ時刻
において
人目の人はマス
に以下のような移動をすることができる。
- その場に留まるか、8近傍のマスに移動する。ただし、グリッドの外側に出ることはできない。また、移動には時間がかからないものとする。
人が全員同じマスに集まる時刻として考えられる最小値を求めよ。
制約
- 入力される値はすべて整数
考察
移動は8近傍に対して行えるので、縦方向と横方向それぞれ独立に考えることができる。
マス へ時刻
までに
人を集めることにする。このとき、縦方向に注目すると、全ての
に対して
が成り立っている必要がある(チェビシェフ距離の1次元バージョン)。
は全ての
に対して閉区間
] に含まれなければならない。これら
個の共通部分は
] と表せ、この区間が存在する条件は
と書くことができる。同様の議論を横方向にも行うことができるので、
であり、 であることを踏まえながら2式をまとめると
となる。
これを満たす最小の整数 は、
である。
あとはこれを実装するだけ。
実装例
#include <bits/stdc++.h> using namespace std; #define rep(i, start, end) for (auto i = (start); (i) < (end); (i)++) constexpr long long INFL = 1e+18; using ll = long long; template <class T1, class T2> inline auto div_ceil(T1 a, T2 b) { if (b < 0) a *= -1, b *= -1; if (a <= 0) return a / b; else return (a - 1) / b + 1; } template <typename T> inline bool chmax(T &a, T b) { return ((a < b) ? (a = b, true) : (false)); } template <typename T> inline bool chmin(T &a, T b) { return ((a > b) ? (a = b, true) : (false)); } // ======================================== // int main() { int N; cin >> N; ll minR = INFL, maxR = -INFL, minC = INFL, maxC = -INFL; rep(i, 0, N) { ll R, C; cin >> R >> C; chmin(minR, R); chmax(maxR, R); chmin(minC, C); chmax(maxC, C); } ll dR = maxR - minR, dC = maxC - minC; cout << div_ceil(max(dR, dC), 2LL) << endl; return 0; }
実装時間: 15分
コメント
なんかD問題よりも難しく感じた。