「白い部分」が常に長方形であることから、その位置を上手に管理しよう。
問題概要
座標平面上で、2 点 を対角線とする長方形領域が与えられる。はじめ、全体が白く塗られている。この領域に対して、次の 回の操作を行なった。
【操作】
3 つの整数 が与えられる。
- のとき: を満たす部分を黒く塗る
- のとき: を満たす部分を黒く塗る
- のとき: を満たす部分を黒く塗る
- のとき: を満たす部分を黒く塗る
すべての操作を終えたあとの、白い部分の面積を求めよ。
制約
考えたこと
白い部分は常に長方形になる!!!
よって、次の 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; }