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

/* template.cpp {{{ */
#include <bits/stdc++.h>
using namespace std;
#define get_macro(a, b, c, d, name, ...) name
#define rep(...) get_macro(__VA_ARGS__, rep4, rep3, rep2, rep1)(__VA_ARGS__)
#define rrep(...)                                                              \\
  get_macro(__VA_ARGS__, rrep4, rrep3, rrep2, rrep1)(__VA_ARGS__)
#define rep1(n) rep2(i_, n)
#define rep2(i, n) rep3(i, 0, n)
#define rep3(i, a, b) rep4(i, a, b, 1)
#define rep4(i, a, b, s) for (ll i = (a); i < (ll)(b); i += (ll)(s))
#define rrep1(n) rrep2(i_, n)
#define rrep2(i, n) rrep3(i, 0, n)
#define rrep3(i, a, b) rrep4(i, a, b, 1)
#define rrep4(i, a, b, s) for (ll i = (ll)(b)-1; i >= (ll)(a); i -= (ll)(s))
#define each(x, c) for (auto &&x : c)
#define fs first
#define sc second
#define all(c) begin(c), end(c)
using ui = unsigned;
using ll = long long;
using ul = unsigned long long;
using ld = long double;
const int inf = 1e9 + 10;
const ll inf_ll = 1e18 + 10;
const ll mod = 1e9 + 7;
const ll mod9 = 1e9 + 9;
const int dx[]{-1, 0, 1, 0, -1, 1, 1, -1};
const int dy[]{0, -1, 0, 1, -1, -1, 1, 1};
template <class T, class U> void chmin(T &x, const U &y) { x = min<T>(x, y); }
template <class T, class U> void chmax(T &x, const U &y) { x = max<T>(x, y); }
struct prepare_ {
  prepare_() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(12);
  }
} prepare__;
/* }}} */

int n, m, r;
string s[50];
int c[3][50][50];
int xx[1000], yy[1000];
vector<int> tt[50][50];
int dp[2010][2];

int dfs(int x, int y, int px, int py, int gx, int gy, int ct) {
  tt[x][y].push_back(ct);
  if (x == gx && y == gy)
    return 0;
  rep(i, 4) {
    int nx = x + dx[i], ny = y + dy[i];
    if (nx == px && ny == py)
      continue;
    if (nx < 0 || nx >= n || ny < 0 || ny >= m)
      continue;
    if (s[nx][ny] == '#')
      continue;
    int t = dfs(nx, ny, x, y, gx, gy, ct + 1);
    if (t < inf)
      return t + 1;
  }
  tt[x][y].pop_back();
  return inf;
}

int main() {
  cin >> n >> m >> r;
  rep(i, n) cin >> s[i];
  rep(i, 3) rep(j, n) rep(k, m) cin >> c[i][j][k];
  rep(i, r) cin >> xx[i] >> yy[i];
  int ct = 0;
  rep(i, r - 1) {
    ct += dfs(xx[i], yy[i], xx[i], yy[i], xx[i + 1], yy[i + 1], ct);
  }
  int res = 0;
  rep(ii, n) rep(jj, m) {
    auto v = tt[ii][jj];
    if (v.empty())
      continue;
    v.push_back(v.back());
    /*if (v.size() == 1){
      res += c[1][ii][jj] + c[2][ii][jj];
      continue;
    }*/
    fill_n(*dp, 2010 * 2, inf);
    dp[0][0] = 0;
    rep(i, v.size() - 1) {
      chmin(dp[i + 1][0], dp[i][0] + c[1][ii][jj] + c[2][ii][jj]);
      chmin(dp[i + 1][0], dp[i][1] + c[2][ii][jj]);
      chmin(dp[i + 1][1],
            dp[i][0] + c[1][ii][jj] + c[0][ii][jj] * (v[i + 1] - v[i]));
      chmin(dp[i + 1][1], dp[i][1] + c[0][ii][jj] * (v[i + 1] - v[i]));
    }
    res += dp[v.size() - 1][0];
  }
  cout << res << endl;
}

Error: 0

Fixed submission:

/* template.cpp {{{ */
#include <bits/stdc++.h>
using namespace std;
#define get_macro(a, b, c, d, name, ...) name
#define rep(...) get_macro(__VA_ARGS__, rep4, rep3, rep2, rep1)(__VA_ARGS__)
#define rrep(...)                                                              \\
  get_macro(__VA_ARGS__, rrep4, rrep3, rrep2, rrep1)(__VA_ARGS__)
#define rep1(n) rep2(i_, n)
#define rep2(i, n) rep3(i, 0, n)
#define rep3(i, a, b) rep4(i, a, b, 1)
#define rep4(i, a, b, s) for (ll i = (a); i < (ll)(b); i += (ll)(s))
#define rrep1(n) rrep2(i_, n)
#define rrep2(i, n) rrep3(i, 0, n)
#define rrep3(i, a, b) rrep4(i, a, b, 1)
#define rrep4(i, a, b, s) for (ll i = (ll)(b)-1; i >= (ll)(a); i -= (ll)(s))
#define each(x, c) for (auto &&x : c)
#define fs first
#define sc second
#define all(c) begin(c), end(c)
using ui = unsigned;
using ll = long long;
using ul = unsigned long long;
using ld = long double;
const int inf = 1e9 + 10;
const ll inf_ll = 1e18 + 10;
const ll mod = 1e9 + 7;
const ll mod9 = 1e9 + 9;
const int dx[]{-1, 0, 1, 0, -1, 1, 1, -1};
const int dy[]{0, -1, 0, 1, -1, -1, 1, 1};
template <class T, class U> void chmin(T &x, const U &y) { x = min<T>(x, y); }
template <class T, class U> void chmax(T &x, const U &y) { x = max<T>(x, y); }
struct prepare_ {
  prepare_() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(12);
  }
} prepare__;
/* }}} */

int n, m, r;
string s[50];
int c[3][50][50];
int xx[1000], yy[1000];
vector<int> tt[50][50];
int dp[2010][2];

int dfs(int x, int y, int px, int py, int gx, int gy, int ct) {
  tt[x][y].push_back(ct);
  if (x == gx && y == gy)
    return 0;
  rep(i, 4) {
    int nx = x + dx[i], ny = y + dy[i];
    if (nx == px && ny == py)
      continue;
    if (nx < 0 || nx >= n || ny < 0 || ny >= m)
      continue;
    if (s[nx][ny] == '#')
      continue;
    int t = dfs(nx, ny, x, y, gx, gy, ct + 1);
    if (t < inf)
      return t + 1;
  }
  tt[x][y].pop_back();
  return inf;
}

int main() {
  cin >> n >> m >> r;
  rep(i, n) cin >> s[i];
  rep(i, 3) rep(j, n) rep(k, m) cin >> c[i][j][k];
  rep(i, r) cin >> xx[i] >> yy[i];
  int ct = 0;
  rep(i, r - 1) {
    ct += dfs(xx[i], yy[i], xx[i], yy[i], xx[i + 1], yy[i + 1], ct);
  }
  int res = 0;
  rep(ii, n) rep(jj, m) {
    if (s[ii][jj] == '#')
      continue;
    auto v = tt[ii][jj];
    v.push_back(v.back());
    /*if (v.size() == 1){
      res += c[1][ii][jj] + c[2][ii][jj];
      continue;
    }*/
    fill_n(*dp, 2010 * 2, inf);
    dp[0][0] = 0;
    rep(i, v.size() - 1) {
      chmin(dp[i + 1][0], dp[i][0] + c[1][ii][jj] + c[2][ii][jj]);
      chmin(dp[i + 1][0], dp[i][1] + c[2][ii][jj]);
      chmin(dp[i + 1][1],
            dp[i][0] + c[1][ii][jj] + c[0][ii][jj] * (v[i + 1] - v[i]));
      chmin(dp[i + 1][1], dp[i][1] + c[0][ii][jj] * (v[i + 1] - v[i]));
    }
    res += dp[v.size() - 1][0];
  }
  cout << res << endl;
}