【AtCoder】ABC 431 B - Robot Weight

B - Robot Weightatcoder.jp favicon

実行時間制限: 2 sec / メモリ制限: 1024 MiB / Difficulty: 36 / NoviSteps: 6Q / 配点: 200 点

問題概要

ロボットがあり、はじめの重さは XX である。

このロボットには、同時に取り付けられる部品がNN 種類あり、種類 ii の部品の重さは WiW_i である。 はじめ、ロボットには NN 種類のうちのどの部品もついていない。

次の QQ 個のクエリを順に処理せよ。 ii 番目のクエリは以下の通り。

  • 現在、ロボットに種類 PiP_i の部品がついていない場合は取り付け、ついている場合は取り外す。その後、現在のロボットの重さを出力する。

制約

  • 1X1001\le X\le100
  • 1N1001\le N\le100
  • 1Wi100 (1iN)1\le W _ i\le100\ (1\le i\le N)
  • 1Q1001\le Q\le100
  • 1PiN (1iQ)1\le P _ i\le N\ (1\le i\le Q)
  • 入力はすべて整数

考察

まずは、ロボットに種類 ii の部品が付いているかどうかをフラグ配列で管理しておこう。

その上で、現在のロボットの重さを保持しておき、クエリごとにフラグの更新と部品の重さを加減算して出力すればよい。

実装例

CPP
1.#include <bits/stdc++.h>
2.using namespace std;
3.
4.#define rep(i, start, end) for (auto i = (start); (i) < (end); (i)++)
5.
6.// ======================================== //
7.
8.int main()
9.{
10. int X, N;
11. cin >> X >> N;
12. vector<int> W(N);
13. rep(i, 0, N) cin >> W[i];
14. int Q;
15. cin >> Q;
16.
17. vector<bool> used(N, false);
18. int ans = X;
19. while (Q--)
20. {
21. int P;
22. cin >> P;
23. P--;
24.
25. if (!used[P])
26. {
27. used[P] = true;
28. ans += W[P];
29. }
30. else
31. {
32. used[P] = false;
33. ans -= W[P];
34. }
35.
36. cout << ans << endl;
37. }
38.
39. return 0;
40.}
Submission #70764424 - TOYOTA SYSTEMS Programming Contest 2025(AtCoder Beginner Contest 431)atcoder.jp favicon

実装時間: 5 分以内

コメント

これも素直に実装できる。