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

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

AtCoder ABC 371 B - Taro (6Q, 灰色, 200 点)

バケットを活用する練習問題!

問題概要

AtCoder 王国には  N 家がある。どこかの家で順に  M 人の赤子が生まれた。

 i 人目の赤子は家  A_{i} で生まれ、性別は  B_{i}('M' または 'F')であった。

各赤子が長男であるかどうかを判定せよ。

制約

  •  1 \le N, M \le 100

考えたこと

 i 人目の赤子が男の子であった場合、赤子  i の生まれた家  A_{i} で過去に男の子が生まれていたかどうかを知る必要があります。そこで、次の配列データを管理しておきましょう。


already[x]:家  x で男の子がすでに生まれたかどうか


初期状態では配列 alreday 全体を false に初期化しておきます。そして、赤子  i が男の子であるとき、次のように処理すればよいでしょう。

  • already[A[i]] = True であるとき:"No" を出力して何もしない
  • already[A[i]] = False であるとき:"Yes" を出力して、already[A[i]] を True にする

コード

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

int main() {
    int N, M, A;
    char C;
    cin >> N >> M;
    vector<int> already(N + 1, false);
    for (int i = 0; i < M; i++) {
        cin >> A >> C;
        if (C == 'M' && !already[A]) {
            cout << "Yes" << endl;
            already[A] = true;
        } else {
            cout << "No" << endl;
        }
    }
}