けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AOJ 2953 Hokkaido University Hard (HUPC 2019 day2-B)

テスターだった。
簡単枠の Easy ヴァージョンに対して「制約あげられるね」と提案して、正式に問題セットになった!

問題概要

 H \times W のグリッドがあって、各マスは '.' か 'B' から成っている。'B' マス間のマンハッタン距離として考えられる最大値を求めよ。

制約

  •  2 \le H, W \le 1000

考えたこと

2 点  (x, y), (X, Y) に対して、

  •  x \le X, y \le Y となっているときは、 |x - X| + |y - Y| = (X + Y) - (x + y) と式変形できる
    • このとき、この値は  (X - Y) - (x - y) よりも大きい
  •  x \le X, y \ge Y となっているときは、 |x - X| + |y - Y| = (X - Y) - (x - y) と式変形できる
    • このとき、この値は  (X + Y) - (x + y) よりも大きい

以上から、次のうちの最大値を求めれば OK。

  • 各 B マス (x, y) についての、x + y の最大値と最小値の差
  • 各 B マス (x, y) についての、x - y の最大値と最小値の差
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

int main() {
    int H, W;
    cin >> H >> W;
    vector<string> fi(H);
    for (int i = 0; i < H; ++i) cin >> fi[i];
    int minS = H+W, maxS = 0, minD = H+W, maxD = -H-W;
    for (int i = 0; i < H; ++i) {
        for (int j = 0; j < W; ++j) {
            if (fi[i][j] != 'B') continue;
            minS = min(minS, i + j);
            maxS = max(maxS, i + j);
            minD = min(minD, i - j);
            maxD = max(maxD, i - j);
        }
    }
    cout << max(maxS - minS, maxD - minD) << endl;
}