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

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

#define rep(i, m, n) for (int(i) = (int)(m); i < (int)(n); ++i)
#define rep2(i, m, n) for (int(i) = (int)(n)-1; i >= (int)(m); --i)
#define REP(i, n) rep(i, 0, n)
#define REP2(i, n) rep2(i, 0, n)
#define FOR(i, c)                                                              \\
  for (decltype((c).begin()) i = (c).begin(); i != (c).end(); ++i)
#define all(hoge) (hoge).begin(), (hoge).end()
#define en '\\n'
using ll = long long;
using ull = unsigned long long;
template <class T> using vec = vector<T>;
template <class T> using vvec = vector<vec<T>>;
typedef pair<ll, ll> P;
constexpr long long INF = 1LL << 60;
constexpr int INF_INT = 1 << 25;
constexpr long long MOD = (ll)1e9 + 7;
// constexpr long long MOD = 998244353LL;
using ld = long double;
static const ld pi = 3.141592653589793L;
typedef vector<ll> Array;
typedef vector<Array> Matrix;

template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}

struct Edge {
  ll to, rev;
  long double cap;
  Edge(ll _to, long double _cap, ll _rev) {
    to = _to;
    cap = _cap;
    rev = _rev;
  }
};
using Edges = vector<Edge>;
using Graph = vector<Edges>;

void add_edge(Graph &G, ll from, ll to, long double cap, bool revFlag,
              long double revCap) {
  G[from].push_back(Edge(to, cap, (ll)G[to].size()));
  if (revFlag)
    G[to].push_back(Edge(from, revCap, (ll)G[from].size() - 1));
}

#pragma GCC target("avx2")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")

void solve() {
  ll h, w, k;
  cin >> h >> w >> k;
  ll sx, sy, gx, gy;
  cin >> sy >> sx >> gy >> gx;
  sx--;
  sy--;
  gx--;
  gy--;
  vec<vvec<pair<int, int>>> dp(
      h, vvec<pair<int, int>>(w, vec<pair<int, int>>(4, {-1, -1})));

  vec<string> s(h);
  REP(i, h) cin >> s[i];

  priority_queue<tuple<int, int, int, int, int>,
                 vec<tuple<int, int, int, int, int>>,
                 greater<tuple<int, int, int, int, int>>>
      que; // cost,d,v,i,j
  que.push(make_tuple(0, 0, -1, sy, sx));

  int dx[4] = {-1, 1, 0, 0};
  int dy[4] = {0, 0, 1, -1};

  while (que.size()) {
    auto [cost, d, v, i, j] = que.top();
    que.pop();
    // cout<<i<<" "<<j<<" "<<v<<en;
    if (v != -1 and dp[i][j][v].first != -1 and cost > dp[i][j][v].first)
      continue;
    REP(m, 4) {
      int ni = i + dy[m];
      int nj = j + dx[m];
      // cout<<ni<<" "<<nj<<" "<<m<<en;
      if (ni < 0 or ni >= h or nj < 0 or nj >= w)
        continue;
      if (s[ni][nj] == '@')
        continue;
      if (v == m and k > d) {
        if (dp[ni][nj][m].first != -1 and
            dp[ni][nj][m] <= make_pair(cost, d + 1))
          continue;
        dp[ni][nj][m] = make_pair(cost, d + 1);
        que.push(make_tuple(cost, d + 1, m, ni, nj));
      } else {
        // cout<<ni<<" "<<nj<<en;
        if (dp[ni][nj][m].first != -1 and
            dp[ni][nj][m] <= make_pair(cost + 1, 1))
          continue;
        dp[ni][nj][m] = make_pair(cost + 1, 1);
        que.push(make_tuple(cost + 1, 1, m, ni, nj));
      }
    }
  }

  int ans = INT_MAX;
  REP(i, 4) {
    // cout<<gy<<" "<<gx<<" "<<i<<en;
    if (dp[gy][gx][i].first != -1)
      chmin(ans, dp[gy][gx][i].first);
  }

  cout << (ans == INT_MAX ? -1 : ans) << en;
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);

  solve();
  // ll t;cin>>t;REP(i,t) solve();

  return 0;
}


Error: TLE

Fixed submission:

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

#define rep(i, m, n) for (int(i) = (int)(m); i < (int)(n); ++i)
#define rep2(i, m, n) for (int(i) = (int)(n)-1; i >= (int)(m); --i)
#define REP(i, n) rep(i, 0, n)
#define REP2(i, n) rep2(i, 0, n)
#define FOR(i, c)                                                              \\
  for (decltype((c).begin()) i = (c).begin(); i != (c).end(); ++i)
#define all(hoge) (hoge).begin(), (hoge).end()
#define en '\\n'
using ll = long long;
using ull = unsigned long long;
template <class T> using vec = vector<T>;
template <class T> using vvec = vector<vec<T>>;
typedef pair<ll, ll> P;
constexpr long long INF = 1LL << 60;
constexpr int INF_INT = 1 << 25;
constexpr long long MOD = (ll)1e9 + 7;
// constexpr long long MOD = 998244353LL;
using ld = long double;
static const ld pi = 3.141592653589793L;
typedef vector<ll> Array;
typedef vector<Array> Matrix;

template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}

struct Edge {
  ll to, rev;
  long double cap;
  Edge(ll _to, long double _cap, ll _rev) {
    to = _to;
    cap = _cap;
    rev = _rev;
  }
};
using Edges = vector<Edge>;
using Graph = vector<Edges>;

void add_edge(Graph &G, ll from, ll to, long double cap, bool revFlag,
              long double revCap) {
  G[from].push_back(Edge(to, cap, (ll)G[to].size()));
  if (revFlag)
    G[to].push_back(Edge(from, revCap, (ll)G[from].size() - 1));
}

void solve() {
  ll h, w, k;
  cin >> h >> w >> k;
  ll sx, sy, gx, gy;
  cin >> sy >> sx >> gy >> gx;
  sx--;
  sy--;
  gx--;
  gy--;
  vec<vvec<pair<int, int>>> dp(
      h, vvec<pair<int, int>>(w, vec<pair<int, int>>(4, {-1, -1})));

  vec<string> s(h);
  REP(i, h) cin >> s[i];

  priority_queue<tuple<int, int, int, int, int>,
                 vec<tuple<int, int, int, int, int>>,
                 greater<tuple<int, int, int, int, int>>>
      que; // cost,d,v,i,j
  que.push(make_tuple(0, 0, -1, sy, sx));

  int dx[4] = {-1, 1, 0, 0};
  int dy[4] = {0, 0, 1, -1};

  while (que.size()) {
    auto [cost, d, v, i, j] = que.top();
    que.pop();
    // cout<<i<<" "<<j<<" "<<v<<en;
    if (dp[i][j][v].first != -1 and cost > dp[i][j][v].first)
      continue;
    REP(m, 4) {
      int ni = i + dy[m];
      int nj = j + dx[m];
      // cout<<ni<<" "<<nj<<" "<<m<<en;
      if (ni < 0 or ni >= h or nj < 0 or nj >= w)
        continue;
      if (s[ni][nj] == '@')
        continue;
      if (v == m and k > d) {
        if (dp[ni][nj][m].first != -1 and
            dp[ni][nj][m] < make_pair(cost, d + 1))
          continue;
        dp[ni][nj][m] = make_pair(cost, d + 1);
        que.push(make_tuple(cost, d + 1, m, ni, nj));
      } else {
        // cout<<ni<<" "<<nj<<en;
        if (dp[ni][nj][m].first != -1 and
            dp[ni][nj][m] < make_pair(cost + 1, 1))
          continue;
        dp[ni][nj][m] = make_pair(cost + 1, 1);
        que.push(make_tuple(cost + 1, 1, m, ni, nj));
      }
    }
  }

  int ans = INT_MAX;
  REP(i, 4) {
    // cout<<gy<<" "<<gx<<" "<<i<<en;
    if (dp[gy][gx][i].first != -1)
      chmin(ans, dp[gy][gx][i].first);
  }

  cout << (ans == INT_MAX ? -1 : ans) << en;
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);

  solve();
  // ll t;cin>>t;REP(i,t) solve();

  return 0;
}