けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 050 B - Contest with Drinks Easy (6Q, 灰色, 200 点)

for 文を回す処理を  M 回やる問題

問題概要

 N 個の整数からなる数列  T_{1}, T_{2}, \dots, T_{N} が与えられる。次の  M 回のクエリに答えよ。

【クエリ】
整数  P, X が与えられる。 T_{P} X に変更したときの、 T_{1} + T_{2} + \dots + T_{N} の値を答えよ。(なお、クエリごとに変更は引き継がれない。)

考えたこと

色んな実現方法が考えられるが、ここでは次のような関数を実装することにした。

// T[P] を X に変更したときの T の総和
int calc(vector<int> T, int P, int X) {
    int sum = 0;
    T[P] = X;
    for (int i = 0; i < T.size(); i++) sum += T[i];
    return sum;
}

このような関数化のメリットの一つとして、関数内部で T を変更しても、関数の外では変更されない。(逆に関数の外でも変更されて欲しかったら参照渡しを使おう。)

この関数 calc() を用いて、次のコードのように書ける。

コード

#include <bits/stdc++.h>
using namespace std;

int calc(vector<int> T, int P, int X) {
    int sum = 0;
    T[P] = X;
    for (int i = 0; i < T.size(); i++) sum += T[i];
    return sum;
}

int main() {
    int N, M, P, X;
    cin >> N;
    vector<int> T(N);
    for (int i = 0; i < N; i++) cin >> T[i];
    cin >> M;
    for (int _ = 0; _ < M; _++) {
        cin >> P >> X, P--;  // 0 始まりに直す
        cout << calc(T, P, X) << endl;
    }
}