以下の内容はhttps://bondo.hateblo.jp/entry/2023/12/17/135738より取得しました。


AtCoder Beginner Contest 333(ABC333)

atcoder.jp

A - Three Threes

$ N $ 回 $ N $ を出力する

提出コード

void solve() {
    int N;
    cin >> N;
    REP(i, N) cout << N;
    cout << endl;
}

B - Pentagon

五角形の頂点を何回移動してたどり着けるかを数え一致していれば Yes

提出コード

void solve() {
    string S, T;
    cin >> S >> T;
    string U = "ABCDEABCDE";
    int s = 10, t = 10;
    REP(i, 10) REP(j, 10) {
        if (S[0] == U[i] and S[1] == U[j]) chmin(s, abs(j - i));
        if (T[0] == U[i] and T[1] == U[j]) chmin(t, abs(j - i));
    }
    cout << (s == t ? "Yes" : "No") << endl;
}

C - Repunit Trio

解の最大値が $ 112222222233 $ であるので12桁までのレピュニットを作り、$ 12 ^ 3 $ 通りの候補を作成、重複を削除してソートをしたものの $ N $ 番目のものが答え

提出コード

void solve() {
    int N;
    cin >> N;
    vector<ll> repu;
    REP(l, 13) {
        ll i = 1;
        REP(_, l) i = i * 10 + 1;
        repu.push_back(i);
    }
    vector<ll> cand;
    for (ll num1 : repu) {
        for (ll num2 : repu) {
            for (ll num3 : repu) {
                cand.push_back(num1 + num2 + num3);
            }
        }
    }
    sort(ALL(cand));
    cand.erase(unique(ALL(cand)), cand.end());
    cout << cand[N - 1] << endl;
}

D - Erase Leaves

頂点 $ 1 $ を削除するためには頂点 $ 1 $ の子が $ 1 $ つである必要がある
そのため子の部分木のサイズが最大のものを残し、それ以外を削除する操作をするのが最適となる

提出コード

void solve() {
    int N;
    cin >> N;
    vector<vector<int>> g(N);
    REP(i, N - 1) {
        int u, v;
        cin >> u >> v;
        --u, --v;
        g[u].emplace_back(v);
        g[v].emplace_back(u);
    }
    vector<int> sz(N);
    auto dfs = [&](auto &&self, int v, int par) -> int {
        sz[v] = 1;
        for (auto &e : g[v]) {
            if (e == par) continue;
            sz[v] += self(self, e, v);
        }
        return sz[v];
    };
    dfs(dfs, 0, -1);
    int ans = INF;
    int sum = 0;
    for (auto nv : g[0]) {
        sum += sz[nv];
    }
    for (auto nv : g[0]) {
        chmin(ans, sum - sz[nv] + 1);
    }
    cout << ans << endl;
}

E - Takahashi Quest

クエリを逆から考えるとクエリ $ 2 $ のときポーションを獲得し、クエリ $ 1 $ のときにそのポーションを持っていれば消費すると考えれば良い
上記をシミュレーションし、持っているポーションの最大値とポーションを獲得するかどうかを求めれば良い

提出コード

void solve() {
    int N;
    cin >> N;
    vector<int> need(202020);
    vector<int> t(N), x(N);
    int ma = 0;
    int sum = 0;
    REP(i, N) cin >> t[i] >> x[i];
    vector<int> ans;
    for (int i = N - 1; i >= 0; i--) {
        if (t[i] == 1) {
            if (need[x[i]]) {
                need[x[i]]--;
                sum--;
                ans.emplace_back(1);
            }
            else ans.emplace_back(0);
        }
        else {
            need[x[i]]++;
            sum++;
            chmax(ma, sum);
        }
    }
    REP(i, 202020) if (need[i] > 0) {
        cout << -1 << endl;
        return;
    }
    cout << ma << endl;
    reverse(ALL(ans));
    for (auto x : ans)
        cout << x << " ";
    cout << endl;
}



以上の内容はhttps://bondo.hateblo.jp/entry/2023/12/17/135738より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14