Problem p02618 (C++) — buggy submission, verdict: Runtime Error

/**/
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <vector>
using namespace std;

int CalcTheDaySatisfaction(int d, const int N, vector<int> &c, vector<int> &s,
                           int t, vector<int> &last) {
  int ret = 0;

  // d日目にA[t]Cを開催すると上がる満足度を足す
  ret += s[t];

  // 低下する満足度を計算する
  for (int i = 0; i < N; ++i)
    ret -= c[i] * (d - last[i]);

  return ret;
}

int main() {
  const int N = 26;

  // 入力
  int D;
  cin >> D;

  vector<int> c(N);
  for (int i = 0; i < N; ++i)
    cin >> c[i];

  vector<vector<int>> s(D);
  for (int i = 0; i < D; ++i) {
    vector<int> tmp(N);
    for (int j = 0; j < N; ++j)
      cin >> tmp[j];
    s[i] = tmp;
  }

  // 初期解生成
  srand((int)time(0));

  vector<int> t(D);
  for (int i = 0; i < D; ++i)
    t[i] = rand() % N;

  // 満足度計算
  int initialSatisfication = 0;
  vector<int> last(N, 0);
  for (int i = 0; i < D; ++i) {
    // last(d, i)を更新する
    last[t[i]] = i + 1;

    // 満足度を更新する
    initialSatisfication +=
        CalcTheDaySatisfaction(i + 1, N, c, s[i], t[i], last);
  }

  int M = 0;
  for (int i = 0; i < M; ++i) {
    int d = rand() % D;
    int q = rand() % N;

    int modificationSatisfication = 0;
    for (int i = 0; i < D; ++i) {
      if (i == d) {
        // last(d, i)を更新する
        last[q] = i + 1;
        // 満足度を更新する
        modificationSatisfication +=
            CalcTheDaySatisfaction(i + 1, N, c, s[i], q, last);
      } else {
        // last(d, i)を更新する
        last[t[i]] = i + 1;
        // 満足度を更新する
        modificationSatisfication +=
            CalcTheDaySatisfaction(i + 1, N, c, s[i], t[i], last);
      }
    }

    if (initialSatisfication < modificationSatisfication)
      t[d] = q;
  }

  // 出力
  for (auto &i : t)
    cout << i + 1 << endl;

  /*
  // B, C問題
  //// 入力
  vector<int> t(D);
  for( int i = 0; i < D; ++i )
      cin >> t[i];
  for( int i = 0; i < D; ++i )
      --t[i];

  int M;
  cin >> M;

  vector<int> d(M), q(M);
  for( int i = 0; i < M; ++i )
      cin >> d[i] >> q[i];
  for( int i = 0; i < M; ++i )
      --d[i], --q[i];

  //// 満足度計算
  vector<int> satisfication(D, 0);
  vector<int> last(N, 0);
  for( int i = 0; i < D; ++i ){
      // last(d, i)を更新する
      last[t[i]] = i + 1;

      // 各日の満足度を計算する
      satisfication[i] = CalcTheDaySatisfaction(i + 1, N, c, s[i], t[i], last);
  }

  //// クエリ処理
  vector<int> modificationSatisfication = satisfication;
  for( int i = 0; i < M; ++i ){

      modificationSatisfication[i] = CalcTheDaySatisfaction(d[i] + 1, N, c,
  s[i], q[i], last);
  }

  // 出力
  cout << satisfication << endl;
  }
  /**/

  return 0;
}
/**/

Error: WA

Fixed submission:

/**/
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <vector>
using namespace std;

int CalcTheDaySatisfaction(int d, const int N, vector<int> &c, vector<int> &s,
                           int t, vector<int> &last) {
  int ret = 0;

  // d日目にA[t]Cを開催すると上がる満足度を足す
  ret += s[t];

  // 低下する満足度を計算する
  for (int i = 0; i < N; ++i)
    ret -= c[i] * (d - last[i]);

  return ret;
}

int main() {
  const int N = 26;

  // 入力
  int D;
  cin >> D;

  vector<int> c(N);
  for (int i = 0; i < N; ++i)
    cin >> c[i];

  vector<vector<int>> s(D);
  for (int i = 0; i < D; ++i) {
    vector<int> tmp(N);
    for (int j = 0; j < N; ++j)
      cin >> tmp[j];
    s[i] = tmp;
  }

  // 初期解生成
  srand((int)time(0));

  vector<int> t(D);
  for (int i = 0; i < D; ++i)
    t[i] = rand() % N + 1;

  // 満足度計算
  int initialSatisfication = 0;
  vector<int> last(N, 0);
  for (int i = 0; i < D; ++i) {
    // last(d, i)を更新する
    last[t[i]] = i + 1;

    // 満足度を更新する
    initialSatisfication +=
        CalcTheDaySatisfaction(i + 1, N, c, s[i], t[i], last);
  }

  int M = 0;
  for (int i = 0; i < M; ++i) {
    int d = rand() % D;
    int q = rand() % N;

    int modificationSatisfication = 0;
    for (int i = 0; i < D; ++i) {
      if (i == d) {
        // last(d, i)を更新する
        last[q] = i + 1;
        // 満足度を更新する
        modificationSatisfication +=
            CalcTheDaySatisfaction(i + 1, N, c, s[i], q, last);
      } else {
        // last(d, i)を更新する
        last[t[i]] = i + 1;
        // 満足度を更新する
        modificationSatisfication +=
            CalcTheDaySatisfaction(i + 1, N, c, s[i], t[i], last);
      }
    }

    if (initialSatisfication < modificationSatisfication)
      t[d] = q;
  }

  // 出力
  for (auto &i : t)
    cout << i + 1 << endl;

  /*
  // B, C問題
  //// 入力
  vector<int> t(D);
  for( int i = 0; i < D; ++i )
      cin >> t[i];
  for( int i = 0; i < D; ++i )
      --t[i];

  int M;
  cin >> M;

  vector<int> d(M), q(M);
  for( int i = 0; i < M; ++i )
      cin >> d[i] >> q[i];

  //// 満足度計算
  int satisfication = 0;
  vector<int> last(N, 0);
  for( int i = 0; i < D; ++i ){
      // last(d, i)を更新する
      last[t[i]] = i + 1;

      // 満足度を更新する
      int initialSatisfication = satisfication + CalcTheDaySatisfaction(i + 1,
  N, c, s[i], t[i], last); int modificationSatisfication = satisfication +
  CalcTheDaySatisfaction(i + 1, N, c, s[i], t[i], last);

      satisfication += CalcTheDaySatisfaction(i + 1, N, c, s[i], t[i], last);

      // 出力
      cout << satisfication << endl;
  }
  /**/

  return 0;
}
/**/