Official
B - Robot Weight Editorial
by
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:
