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

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

long d;
long c[26];
long s[365][26];
long t[365];
long last[26];
long tmpAdd[26];

long nowAns;

long calcMinus(int day, long *last);
long calcScore();

int main() {
  nowAns = 0;
  cin >> d;
  for (int i = 0; i < 26; i++)
    cin >> c[i];
  for (int i = 0; i < d; i++) {
    for (int j = 0; j < 26; j++) {
      cin >> s[i][j];
    }
  }
  srand(1);

  for (int i = 0; i < 365; i++) {
    t[i] = rand() % 26 + 1;
  }
  nowAns = calcScore();

  for (int i = 0; i < 26; i++) {
    last[i] = tmpAdd[i];
  }

  for (int cc = 0; cc < 200; cc++) {

    int qq = 0;
    int qqbef = 0;
    int dd = 0;

    while (qq == qqbef) {
      dd = rand() % 365;
      qq = t[dd];
      qqbef = t[dd];
      for (int i = 0; i < 26; i++) {
        if (s[dd][qq - 1] < s[dd][i]) {
          qq = i + 1;
        }
      }
    }

    t[dd] = qq;
    long tmp = calcScore();
    bool chk = true;
    if (tmp > nowAns) {
      if (rand() % 100 > 90) {
        chk = false;
      }
    } else {
      if (rand() % 100 > 10) {
        chk = false;
      }
    }

    if (chk) {
      for (int i = 0; i < 26; i++) {
        last[i] = tmpAdd[i];
      }
    } else {
      t[dd] = qqbef;
    }
  }

  for (int i = 0; i < d; i++) {
    cout << t[i] << endl;
  }
}

long calcMinus(int day, long *tmplast) {

  long ans = 0;
  for (int i = 0; i < 26; i++) {
    ans -= c[i] * (day - tmplast[i]);
  }

  return ans;
}

long calcScore() {
  long ans = 0;

  long tmplast[26];
  for (int i = 0; i < 26; i++) {
    tmplast[i] = -1;
  }

  for (int i = 0; i < d; i++) {
    tmplast[t[i] - 1] = i;
    ans += s[i][t[i] - 1];
    ans += calcMinus(i, tmplast);
  }

  for (int i = 0; i < 26; i++) {
    tmpAdd[i] = tmplast[i];
  }

  return ans;
}

Error: WA

Fixed submission:

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

long d;
long c[26];
long s[365][26];
long t[365];
long last[26];
long *tmpAdd;

long nowAns;

long calcMinus(int day, long *last);
long calcScore();

int main() {
  nowAns = 0;
  d = 365;
  cin >> d;
  for (int i = 0; i < 26; i++)
    cin >> c[i];
  for (int i = 0; i < d; i++) {
    for (int j = 0; j < 26; j++) {
      cin >> s[i][j];
    }
  }
  srand(1);

  for (int i = 0; i < 365; i++) {
    t[i] = rand() % 26 + 1;
  }
  nowAns = calcScore();
  for (int i = 0; i < 26; i++) {
    last[i] = tmpAdd[i];
  }

  for (int cc = 0; cc < 1000; cc++) {
    int dd = 0;
    for (int i = 1; i < d; i++) {
      if (c[dd] * (last[dd] - 364) < c[i] * (last[i] - 364)) {
        if (rand() % 100 > 0)
          dd = i;
      }
    }
    int qq = t[dd];
    int qqbef = qq;

    for (int i = 0; i < 26; i++) {
      if (s[dd][qq - 1] > s[dd][i]) {
        if (rand() % 100 > 0)
          qq = i + 1;
      }
    }
    t[dd] = qq;
    long tmp = calcScore();
    if (tmp > nowAns) {
      if (rand() % 100 > 90) {
        t[dd] = qqbef;
      }
    } else {
      if (rand() % 100 > 10) {
        t[dd] = qqbef;
      }
    }
  }

  for (int i = 0; i < d; i++) {
    cout << t[i] << endl;
  }
}

long calcMinus(int day, long *tmplast) {

  long ans = 0;
  for (int i = 0; i < 26; i++) {
    ans -= c[i] * (day - tmplast[i]);
  }

  return ans;
}

long calcScore() {
  long ans = 0;

  long tmplast[26];
  for (int i = 0; i < 26; i++) {
    tmplast[i] = -1;
  }

  for (int i = 0; i < d; i++) {
    tmplast[t[i] - 1] = i;
    ans += s[i][t[i] - 1];
    ans += calcMinus(i, tmplast);
  }

  tmpAdd = tmplast;

  return ans;
}