Problem p02630 (C++) — buggy submission, verdict: Time Limit Exceeded

// ConsoleApplication1.cpp : このﾌｧｲﾙには ’main’
// 関数が福間れています。プログラム実行の開始と終了がそこで行われます。
//

// #include "pch.h"

#include <algorithm>
#include <climits>
#include <cmath>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <vector>
using namespace std;
#define ll long long
#define ld long double
#define pi 3.14159265359;
// %llu %lf

// v:vector  type:型  order:greater(大きい順) or less(小さい順)
#define _sort(v, type, order)                                                  \\
  do {                                                                         \\
    sort(v.begin(), v.end(), order<type>());                                   \\
  } while (0)
// vector 要素の総和算出
// v:vector  default_value:初期値
#define _sum(v, default_value) accumulate(v.begin(), v.end(), default_value)
// vector 最大値( return ite )
#define _max_element(v) max_element(v.begin(), v.end())
// vector 最小値( return ite )
#define _min_element(v) min_element(v.begin(), v.end())
// vector 最大値が格納されている要素値
#define _max_element_number(v)                                                 \\
  distance(v.begin(), max_element(v.begin(), v.end()))
// 特定コンテナの中から特定の値をカウントする
#define _count(v, value) count(v.begin(), v.end(), value)

// set<uint32_t> member;	// 重複するデータを保持する事はできない
// member.insert(2) member.insert(2) ⇒ member.count(2)は1
//                                                               member.emplace(2)とかも同じ
// multiset<uint32_t> v;	// 重複するデータも保持する事はできる
// member.insert(2) member.insert(2) ⇒ member.count(2)は2

// 丸め
#define _round(v) round(v)
// 2乗 / 3乗
#define _square(v) pow(v, 2)
#define _cube(v) pow(v, 3)
// 大小判定
#define _max(x, y) max(x, y)
#define _min(x, y) min(x, y)
// string ⇒ int
#define _stringtoi(s) stoi(s)
// double 平方根
#define _sqrt(x) sqrt(x)
// double 引数 x 以上で最小の整数値 ex) 3.30303 ⇒ 4
#define _ceil(x) ceil(x)
// 指定された要素以上の値が現れる最初の位置のイテレータを取得する
#define _lower_bound(v, min) lower_bound(v.begin(), v.end(), min)
// 指定された要素より大きい値が現れる最初の位置のイテレータを取得する
#define _upper_bound(v, min) upper_bound(v.begin(), v.end(), min)

// 順列 n個の数が与えられる
// 0,1,2,...,n-1
// 全ての並べ方を1行ごとに出力する
// ex 0 1 2 / 0 2 1 / 1 0 2 / 1 2 0 / 2 0 1 / 2 1 0
#define _next_permutation(v)                                                   \\
  do {                                                                         \\
    for (auto num : v) {                                                       \\
      printf("%d ", num);                                                      \\
    }                                                                          \\
    printf("\\n");                                                              \\
  } while (next_permutation(v.begin(), v.end()))

// 絶対値
template <typename T> static T _abs(const T x) { return (x > 0 ? x : -x); }

// 最大公約数
int64_t gcd(int64_t a, int64_t b) {
  while (b) {
    int64_t c = b;
    b = a % b;
    a = c;
  }
  return a;
}
// 最小公倍数
int64_t lcm(int64_t a, int64_t b) {
  if (!a || !b)
    return 0;
  return a * b / gcd(a, b);
}

// 多次元 std::vector 生成
template <class T> vector<T> make_vec(size_t a) { return vector<T>(a); }
template <class T, class... Ts> auto make_vec(size_t a, Ts... ts) {
  return vector<decltype(make_vec<T>(ts...))>(a, make_vec<T>(ts...));
}
// ex) auto dp = make_vec<uint64_t>(SIZE + 1, 2, 2);

// ■
// UINT32_MAX
// 4294967295 ≒ 4 * 1e9

// ■
// 割り算した結果との比較での丸め対処時
// ABC 161 B
// https://atcoder.jp/contests/abc161/tasks/abc161_b
// double   border = _sum(v, 0 / (double)(4 * m);
//            ↓
// uint32_t border = (_sum(v, 0) + (4 * m) - 1) / (4 * m);

// ■
// N の数が与えられた場合の組合せ N * (N - 1) / 2

// ABC 013 C
// C - 節制
// https://atcoder.jp/contests/abc013/tasks/abc013_3
/*
        ■問題文
        セキュリティ意識が高く、最新鋭の錠を購入した高橋君ですが、財布の管理は甘かったらしくお金がピンチな状況です。
        高橋君の収入は安定せず、次の収入があるのは今から N 日後です。高橋君は N
   日間、できるだけ食費を抑えて節約生活を送ることにしました。
        はじめ、高橋君の満腹度は H です。N
   日間のそれぞれの日について、その日にとる食事を次の 3 種類の中から 1
   つ選びます。

    ・普通の食事: A 円の出費をして、満腹度が B 増える。
        ・質素な食事: C 円の出費をして、満腹度が D 増える。（ただし、C<A かつ
   D<B） ・食事抜き: 出費なしで、満腹度が E 減る。

        厳しく節約すれば出費を抑えることができますが、あまりに節約しすぎて体調を崩してしまってはいけないため、N
   日間で一度も満腹度が 0 以下にならないようにしなければなりません。
        高橋君は最低何円の食費で N 日間を乗り切ることができるでしょうか？

        ただし、高橋君は超人級の胃袋を持っており、その満腹度には上限がないとする。すなわち、いくら食事をしても高橋君の満腹度が頭打ちになることはない。

        ■入力
        N H
        A B C D E
        で与えられる

        参考文献↓
        http://keita-matsushita.hatenablog.com/entry/2016/11/11/181557
        https://qiita.com/shihou22/items/0669c682787cf9a6bdc8
*/

// DPテーブル
int32_t dp[110][100005];

int main() {

  int32_t n;
  cin >> n;

  map<int32_t, int32_t> v;
  int64_t result = 0;
  int32_t temp;
  for (int32_t i = 0; i < n; i++) {
    cin >> temp;
    v[temp]++;
    result += temp;
  }

  int32_t b, c, q;

  cin >> q;
  int32_t _sign;
  for (int32_t i = 0; i < q; i++) {
    cin >> b >> c;

    _sign = c - b;

    std::size_t cnt = v.count(b);
    if (cnt > 0) {
      result = result + _sign * v[b];

      v[c] += v[b];
      v[b] = 0;
    }
    printf("%lld\\n", result);
  }

  return 0;
}

// プログラムの実行: Ctrl + F5 または [デバッグ] > [デバッグなしで開始] メニュー
// プログラムのデバッグ: F5 または [デバッグ] > [デバッグの開始] メニュー

// 作業を開始するためのヒント:
//    1. ソリューション エクスプローラー
//    ウィンドウを使用してファイルを追加/管理します
//   2. チーム エクスプローラー ウィンドウを使用してソース管理に接続します
//   3. 出力ウィンドウを使用して、ビルド出力とその他のメッセージを表示します
//   4. エラー一覧ウィンドウを使用してエラーを表示します
//   5. [プロジェクト] > [新しい項目の追加] と移動して新しいコード
//   ファイルを作成するか、[プロジェクト] > [既存の項目の追加]
//   と移動して既存のコード ファイルをプロジェクトに追加します
//   6. 後ほどこのプロジェクトを再び開く場合、[ファイル] > [開く] >
//   [プロジェクト] と移動して .sln ファイルを選択します


Error: TLE

Fixed submission:

// ConsoleApplication1.cpp : このﾌｧｲﾙには ’main’
// 関数が福間れています。プログラム実行の開始と終了がそこで行われます。
//

// #include "pch.h"

#include <algorithm>
#include <climits>
#include <cmath>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <vector>
using namespace std;
#define ll long long
#define ld long double
#define pi 3.14159265359;
// %llu %lf

// v:vector  type:型  order:greater(大きい順) or less(小さい順)
#define _sort(v, type, order)                                                  \\
  do {                                                                         \\
    sort(v.begin(), v.end(), order<type>());                                   \\
  } while (0)
// vector 要素の総和算出
// v:vector  default_value:初期値
#define _sum(v, default_value) accumulate(v.begin(), v.end(), default_value)
// vector 最大値( return ite )
#define _max_element(v) max_element(v.begin(), v.end())
// vector 最小値( return ite )
#define _min_element(v) min_element(v.begin(), v.end())
// vector 最大値が格納されている要素値
#define _max_element_number(v)                                                 \\
  distance(v.begin(), max_element(v.begin(), v.end()))
// 特定コンテナの中から特定の値をカウントする
#define _count(v, value) count(v.begin(), v.end(), value)

// set<uint32_t> member;	// 重複するデータを保持する事はできない
// member.insert(2) member.insert(2) ⇒ member.count(2)は1
//                                                               member.emplace(2)とかも同じ
// multiset<uint32_t> v;	// 重複するデータも保持する事はできる
// member.insert(2) member.insert(2) ⇒ member.count(2)は2

// 丸め
#define _round(v) round(v)
// 2乗 / 3乗
#define _square(v) pow(v, 2)
#define _cube(v) pow(v, 3)
// 大小判定
#define _max(x, y) max(x, y)
#define _min(x, y) min(x, y)
// string ⇒ int
#define _stringtoi(s) stoi(s)
// double 平方根
#define _sqrt(x) sqrt(x)
// double 引数 x 以上で最小の整数値 ex) 3.30303 ⇒ 4
#define _ceil(x) ceil(x)
// 指定された要素以上の値が現れる最初の位置のイテレータを取得する
#define _lower_bound(v, min) lower_bound(v.begin(), v.end(), min)
// 指定された要素より大きい値が現れる最初の位置のイテレータを取得する
#define _upper_bound(v, min) upper_bound(v.begin(), v.end(), min)

// 順列 n個の数が与えられる
// 0,1,2,...,n-1
// 全ての並べ方を1行ごとに出力する
// ex 0 1 2 / 0 2 1 / 1 0 2 / 1 2 0 / 2 0 1 / 2 1 0
#define _next_permutation(v)                                                   \\
  do {                                                                         \\
    for (auto num : v) {                                                       \\
      printf("%d ", num);                                                      \\
    }                                                                          \\
    printf("\\n");                                                              \\
  } while (next_permutation(v.begin(), v.end()))

// 絶対値
template <typename T> static T _abs(const T x) { return (x > 0 ? x : -x); }

// 最大公約数
int64_t gcd(int64_t a, int64_t b) {
  while (b) {
    int64_t c = b;
    b = a % b;
    a = c;
  }
  return a;
}
// 最小公倍数
int64_t lcm(int64_t a, int64_t b) {
  if (!a || !b)
    return 0;
  return a * b / gcd(a, b);
}

// 多次元 std::vector 生成
template <class T> vector<T> make_vec(size_t a) { return vector<T>(a); }
template <class T, class... Ts> auto make_vec(size_t a, Ts... ts) {
  return vector<decltype(make_vec<T>(ts...))>(a, make_vec<T>(ts...));
}
// ex) auto dp = make_vec<uint64_t>(SIZE + 1, 2, 2);

// ■
// UINT32_MAX
// 4294967295 ≒ 4 * 1e9

// ■
// 割り算した結果との比較での丸め対処時
// ABC 161 B
// https://atcoder.jp/contests/abc161/tasks/abc161_b
// double   border = _sum(v, 0 / (double)(4 * m);
//            ↓
// uint32_t border = (_sum(v, 0) + (4 * m) - 1) / (4 * m);

// ■
// N の数が与えられた場合の組合せ N * (N - 1) / 2

// ABC 013 C
// C - 節制
// https://atcoder.jp/contests/abc013/tasks/abc013_3
/*
        ■問題文
        セキュリティ意識が高く、最新鋭の錠を購入した高橋君ですが、財布の管理は甘かったらしくお金がピンチな状況です。
        高橋君の収入は安定せず、次の収入があるのは今から N 日後です。高橋君は N
   日間、できるだけ食費を抑えて節約生活を送ることにしました。
        はじめ、高橋君の満腹度は H です。N
   日間のそれぞれの日について、その日にとる食事を次の 3 種類の中から 1
   つ選びます。

    ・普通の食事: A 円の出費をして、満腹度が B 増える。
        ・質素な食事: C 円の出費をして、満腹度が D 増える。（ただし、C<A かつ
   D<B） ・食事抜き: 出費なしで、満腹度が E 減る。

        厳しく節約すれば出費を抑えることができますが、あまりに節約しすぎて体調を崩してしまってはいけないため、N
   日間で一度も満腹度が 0 以下にならないようにしなければなりません。
        高橋君は最低何円の食費で N 日間を乗り切ることができるでしょうか？

        ただし、高橋君は超人級の胃袋を持っており、その満腹度には上限がないとする。すなわち、いくら食事をしても高橋君の満腹度が頭打ちになることはない。

        ■入力
        N H
        A B C D E
        で与えられる

        参考文献↓
        http://keita-matsushita.hatenablog.com/entry/2016/11/11/181557
        https://qiita.com/shihou22/items/0669c682787cf9a6bdc8
*/

// DPテーブル
int32_t dp[110][100005];

int main() {

  int32_t n;
  cin >> n;
  vector<int32_t> v(n);

  for (int32_t i = 0; i < n; i++) {
    cin >> v[i];
  }

  int32_t b, c, q;

  cin >> q;
  int64_t result;
  for (int32_t i = 0; i < q; i++) {
    cin >> b >> c;
    replace(v.begin(), v.end(), b, c);

    result = 0;
    for (int32_t i = 0; i < n; i++) {
      result += v[i];
    }
    printf("%lld\\n", result);
  }

  return 0;
}

// プログラムの実行: Ctrl + F5 または [デバッグ] > [デバッグなしで開始] メニュー
// プログラムのデバッグ: F5 または [デバッグ] > [デバッグの開始] メニュー

// 作業を開始するためのヒント:
//    1. ソリューション エクスプローラー
//    ウィンドウを使用してファイルを追加/管理します
//   2. チーム エクスプローラー ウィンドウを使用してソース管理に接続します
//   3. 出力ウィンドウを使用して、ビルド出力とその他のメッセージを表示します
//   4. エラー一覧ウィンドウを使用してエラーを表示します
//   5. [プロジェクト] > [新しい項目の追加] と移動して新しいコード
//   ファイルを作成するか、[プロジェクト] > [既存の項目の追加]
//   と移動して既存のコード ファイルをプロジェクトに追加します
//   6. 後ほどこのプロジェクトを再び開く場合、[ファイル] > [開く] >
//   [プロジェクト] と移動して .sln ファイルを選択します