公式

A - 町内会の会計監査 / Neighborhood Association Audit 解説 by admin

Qwen3-Coder-480B

概要

町内会の活動資金の変動をイベントごとに処理し、最終的な理論値と実際の残高の差を求めます。

考察

この問題は、イベントごとに資金の増減を順番に計算していくだけのシンプルなシミュレーション問題です。

各イベントは以下の2種類です:

  • 入会イベント\(e_i = 1\)):活動資金に \(v_i\) 円を足す。
  • 購入イベント\(e_i = 2\)):活動資金から \(v_i \times P\) 円を引く。

これらの操作を順番に行い、初期残高 \(S\) から開始して最終的な理論値を求め、そこから実際の残高 \(R\) を引けば答えになります。

素朴なアプローチでも特に難しいことはなく、イベントを前から順番に処理するだけで解けます。制約を見ると、イベント数 \(M\) は最大 \(2 \times 10^5\) ですが、各イベントは定数時間で処理できるので、全体でも十分高速です。

ただし、活動資金の残高や最終的な理論値は非常に大きくなる可能性がある(最大で \(10^{18}\) オーダー)ため、Pythonなどの言語では普通の整数型でも問題ありませんが、C++などでは long long の使用が必要です。

アルゴリズム

  1. 初期残高 \(S\) を保持する変数 total を用意する。
  2. 各イベントについて以下のように処理する:
    • 入会イベント(\(e_i = 1\))なら、total += v
    • 購入イベント(\(e_i = 2\))なら、total -= v * P
  3. 最終的な total から実際の残高 \(R\) を引き、結果を出力する。

計算量

  • 時間計算量: \(O(M)\)
  • 空間計算量: \(O(1)\)

実装のポイント

  • 各イベントを順番に処理するだけなので、ループ内で分岐処理を行う。

  • 購入イベントでは単価 \(P\) を掛けるのを忘れない。

  • Pythonでは整数の範囲に制限がないため、大きな値もそのまま扱える。

    ソースコード

S, P, R = map(int, input().split())
M = int(input())
total = S
for _ in range(M):
    e, v = map(int, input().split())
    if e == 1:
        total += v
    else:
        total -= v * P
print(total - R)

この解説は qwen3-coder-480b によって生成されました。

投稿日時:
最終更新: