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() {
  int h, w, k;
  cin >> h >> w >> k;
  ll sx, sy, gx, gy;
  cin >> sy >> sx >> gy >> gx;
  sx--;
  sy--;
  gx--;
  gy--;

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

  queue<pair<int, int>> que;
  que.push({sy, sx});
  vvec<ll> d(h, vec<ll>(w, INF));
  d[sy][sx] = 0;

  while (que.size()) {
    auto [i, j] = que.front();
    que.pop();
    // down
    for (int ni = i + 1; ni <= min(h - 1, i + k); ++ni) {
      if (s[ni][j] == '@' or d[ni][j] < d[i][j] + 1)
        break;
      if (chmin(d[ni][j], d[i][j] + 1))
        que.push({ni, j});
    }
    // up
    for (int ni = i - 1; ni >= max(0, i - k); --ni) {
      if (s[ni][j] == '@' or d[ni][j] < d[i][j] + 1)
        break;
      if (chmin(d[ni][j], d[i][j] + 1))
        que.push({ni, j});
    }
    // left
    for (int nj = j + 1; nj <= min(w - 1, j + k); ++nj) {
      if (s[i][nj] == '@' or d[i][nj] < d[i][j] + 1)
        break;
      if (chmin(d[i][nj], d[i][j] + 1))
        que.push({i, nj});
    }
    // up
    for (int nj = j - 1; nj >= max(0, j - k); --nj) {
      if (s[i][nj] == '@' or d[i][nj] < d[i][j] + 1)
        break;
      if (chmin(d[i][nj], d[i][j] + 1))
        que.push({i, nj});
    }
  }
  cout << (d[gy][gx] == INF ? -1 : d[gy][gx]) << 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));
}

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

void solve() {
  int h, w, k;
  cin >> h >> w >> k;
  ll sx, sy, gx, gy;
  cin >> sy >> sx >> gy >> gx;
  sx--;
  sy--;
  gx--;
  gy--;

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

  queue<pair<int, int>> que;
  que.push({sy, sx});
  vvec<ll> d(h, vec<ll>(w, INF));
  d[sy][sx] = 0;

  while (que.size()) {
    auto [i, j] = que.front();
    que.pop();
    // down
    for (int ni = i + 1; ni <= min(h - 1, i + k); ++ni) {
      if (s[ni][j] == '@')
        break;
      if (d[ni][j] <= d[i][j] + 1)
        continue;
      d[ni][j] = d[i][j] + 1;
      que.push({ni, j});
    }
    // up
    for (int ni = i - 1; ni >= max(0, i - k); --ni) {
      if (s[ni][j] == '@')
        break;
      if (d[ni][j] <= d[i][j] + 1)
        continue;
      d[ni][j] = d[i][j] + 1;
      que.push({ni, j});
    }
    // left
    for (int nj = j + 1; nj <= min(w - 1, j + k); ++nj) {
      if (s[i][nj] == '@')
        break;
      if (d[i][nj] <= d[i][j] + 1)
        continue;
      d[i][nj] = d[i][j] + 1;
      que.push({i, nj});
    }
    // up
    for (int nj = j - 1; nj >= max(0, j - k); --nj) {
      if (s[i][nj] == '@')
        break;
      if (d[i][nj] <= d[i][j] + 1)
        continue;
      d[i][nj] = d[i][j] + 1;
      que.push({i, nj});
    }
  }
  cout << (d[gy][gx] == INF ? -1 : d[gy][gx]) << 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;
}