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

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

AtCoder ABC 047 B - すぬけ君の塗り絵 2 イージー (6Q, 灰色, 200 点)

「白い部分」が常に長方形であることから、その位置を上手に管理しよう。

問題概要

座標平面上で、2 点  (0, 0), (W, H) を対角線とする長方形領域が与えられる。はじめ、全体が白く塗られている。この領域に対して、次の  Q 回の操作を行なった。

【操作】
3 つの整数  x_{i}, y_{i}, a_{i} が与えられる。

  •  a_{i} = 1 のとき: x \lt x_{i} を満たす部分を黒く塗る
  •  a_{i} = 2 のとき: x \gt x_{i} を満たす部分を黒く塗る
  •  a_{i} = 3 のとき: y \lt y_{i} を満たす部分を黒く塗る
  •  a_{i} = 4 のとき: y \gt y_{i} を満たす部分を黒く塗る

すべての操作を終えたあとの、白い部分の面積を求めよ。

制約

  •  1 \le W, H, N \le 100

考えたこと

白い部分は常に長方形になる!!!

よって、次の 4 つの値を管理することにしよう。


  • lx:白い部分の左端の x 座標
  • rx:白い部分の右端の x 座標
  • ly:白い部分の下端の y 座標
  • ry:白い部分の上端の y 座標

これらの値を適切に更新し、最後は (rx - lx) * (ry - ly) の値を答えれば良い(lx < rx かつ ly < ry の場合のみ)。

コード

#include <bits/stdc++.h>
using namespace std;

int main() {
    int W, H, N, x, y, a;
    cin >> W >> H >> N;

    int lx = 0, rx = W, ly = 0, ry = H;
    for (int _ = 0; _ < N; _++) {
        cin >> x >> y >> a;
        if (a == 1) lx = max(lx, x);
        else if (a == 2) rx = min(rx, x);
        else if (a == 3) ly = max(ly, y);
        else ry = min(ry, y);
    }
    if (lx <= rx && ly <= ry) cout << (rx - lx) * (ry - ly) << endl;
    else cout << 0 << endl;
}