Official

B - Robot Weight Editorial by MMNMM


それぞれの種類の部品について、「現在ロボットについているか」を管理することができれば、クエリではその情報を更新しつつ、情報をもとに重さを計算することでこの問題を解くことができます。

\(N\) 個の「ついている/ついていない」の情報を管理するために、配列やリストなどの言語機能を用いるとよいでしょう。

実装例は以下のようになります。

#include <iostream>
#include <vector>

int main() {
    using namespace std;
    int X, N;
    cin >> X >> N;
    vector<int> W(N);
    for (auto&& w : W)
        cin >> w;
    vector<bool> b(N); // b[i] := i 種類目のパーツがついていれば true, そうでなければ false

    int Q;
    cin >> Q;
    for (int q = 0; q < Q; ++q) {
        int P;
        cin >> P;
        --P;
        if (b[P]) { // すでについていたら
            b[P] = false; // 外す
        } else { // ついていなければ
            b[P] = true; // つける
        }

        // 重さを求める
        int weight = X;
        for (int i = 0; i < N; ++i) {
            if (b[i]) { // i 番目のパーツがついていれば
                weight += W[i]; // 重さを足す
            }
        }
        cout << weight << endl;
        // #include <numeric> して
        // cout << transform_reduce(begin(W), end(W), begin(b), X) << endl;
        // と書いてもいい
    }
    return 0;
}
X = int(input())
N = int(input())
W = list(map(int, input().split()))

b = [False] * N # b[i] := i 種類目のパーツがついていれば True, そうでなければ False

Q = int(input())

for q in range(Q):
    P = int(input())
    P -= 1
    if b[P]: # すでについていたら
        b[P] = False # 外す
    else: # ついていなければ
        b[P] = True # つける

    # 重さを求める
    weight = X
    for i in range(N):
        if b[i]: # i 番目のパーツがついていれば
            weight += W[i] # 重さを足す
    print(weight)
    # print(sum((w if f else 0 for w, f in zip(W, b)), X))
    # と書いてもいい

posted:
last update: