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

#pragma GCC optimize("O3")
#pragma GCC target("sse4")

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

typedef long long ll;
typedef long double ld;
typedef double db;
typedef string str;

typedef pair<int, int> pi;
typedef pair<ll, ll> pl;
typedef pair<db, db> pd;

typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<db> vd;
typedef vector<str> vs;
typedef vector<pi> vpi;
typedef vector<pl> vpl;
typedef vector<pd> vpd;

#define mp make_pair
#define f first
#define s second
#define sz(x) (int)(x).size()
#define all(x) begin(x), end(x)
#define rall(x) (x).rbegin(), (x).rend()
#define rsz resize
#define ins insert
#define ft front()
#define bk back()
#define pf push_front
#define pb push_back
#define eb emplace_back
#define lb lower_bound
#define ub upper_bound

#define FOR(i, a, b) for (int i = (a); i < (b); ++i)
#define F0R(i, a) FOR(i, 0, a)
#define ROF(i, a, b) for (int i = (b)-1; i >= (a); --i)
#define R0F(i, a) ROF(i, 0, a)
#define trav(a, x) for (auto &a : x)

const int MX = 1e3 + 5;
const int MOD = 1e9 + 7; // 998244353;
const ll INF = 1e18;
const ld PI = acos((ld)-1);

const int xd[4] = {1, 0, -1, 0}, yd[4] = {0, 1, 0, -1};
mt19937 rng((uint32_t)chrono::steady_clock::now().time_since_epoch().count());

template <class T> bool ckmin(T &a, const T &b) { return b < a ? a = b, 1 : 0; }
template <class T> bool ckmax(T &a, const T &b) { return a < b ? a = b, 1 : 0; }

constexpr int pct(int x) { return __builtin_popcount(x); }  // number of ones
constexpr int bits(int x) { return 31 - __builtin_clz(x); } // floor(log2(x))
template <class T> T cdiv(T a, T b) {
  return a / b + !(a < 0 || a % b == 0);
} // division of a by b rounded up, assumes b > 0

int fstTrue(function<bool(int)> f, int lo, int hi) {
  hi++;
  assert(lo <= hi); // assuming f is increasing
  while (lo < hi) { // find first index such that f is true
    int mid = (lo + hi) / 2;
    f(mid) ? hi = mid : lo = mid + 1;
  }
  return lo;
}

template <class T> void remDup(vector<T> &v) {
  sort(all(v));
  v.erase(unique(all(v)), end(v));
}

// DEBUG
void DBG() { cerr << "]" << endl; }
template <class H, class... T> void DBG(H h, T... t) {
  cerr << h;
  if (sizeof...(t))
    cerr << ", ";
  DBG(t...);
}
#define dbg(...)                                                               \\
  cerr << "LINE(" << __LINE__ << ") -> [" << #__VA_ARGS__ << "]: [",           \\
      DBG(__VA_ARGS__)

// FILE I/O
void setIn(str S) { freopen(S.c_str(), "r", stdin); }
void setOut(str S) { freopen(S.c_str(), "w", stdout); }
void setIO(str S = "") {
  ios_base::sync_with_stdio(0);
  cin.tie(0); // fast I/O
  // cin.exceptions(cin.failbit);
  // throws exception when do smth illegal
  // ex. try to read letter into int
  if (sz(S)) {
    setIn(S + ".in"), setOut(S + ".out");
  } // for USACO
}

int N, M;
char arr[MX][MX];
int dist[MX][MX];

bool ok(int x, int y) { return x >= 1 && x <= N && y >= 1 && y <= M; }

int dijkstra(pi st, pi en) {
  priority_queue<pair<int, pi>, vector<pair<int, pi>>, greater<pair<int, pi>>>
      todo;
  todo.push({0, st});
  dist[st.f][st.s] = 0;
  while (sz(todo)) {
    auto cur = todo.top();
    todo.pop();

    if (cur.s == en)
      return cur.f;

    F0R(i, 4) {
      int nx = cur.s.f + xd[i];
      int ny = cur.s.s + yd[i];

      if (!ok(nx, ny) || arr[nx][ny] == '#')
        continue;
      if (dist[nx][ny] > dist[cur.s.f][cur.s.s]) {
        dist[nx][ny] = dist[cur.s.f][cur.s.s];
        todo.push({dist[nx][ny], {nx, ny}});
      }
    }

    FOR(i, -2, 3) {
      FOR(j, -2, 3) {
        int nx = cur.s.f + i;
        int ny = cur.s.s + j;

        if (i == 0 && j == 0)
          continue;
        if (!ok(nx, ny) || arr[nx][ny] == '#')
          continue;
        if (dist[nx][ny] > dist[cur.s.f][cur.s.s] + 1) {
          dist[nx][ny] = dist[cur.s.f][cur.s.s] + 1;
          todo.push({dist[nx][ny], {nx, ny}});
        }
      }
    }
  }
  return -1;
}

int32_t main() {

  setIO();

  cin >> N >> M;

  pi st, en;
  cin >> st.f >> st.s >> en.f >> en.s;

  FOR(i, 1, N + 1) FOR(j, 1, M + 1) {
    cin >> arr[i][j];
    dist[i][j] = MOD;
  }

  cout << dijkstra(st, en) << "\\n";
}

Error: TLE

Fixed submission:

#pragma GCC optimize("O3")
#pragma GCC target("sse4")

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

typedef long long ll;
typedef long double ld;
typedef double db;
typedef string str;

typedef pair<int, int> pi;
typedef pair<ll, ll> pl;
typedef pair<db, db> pd;

typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<db> vd;
typedef vector<str> vs;
typedef vector<pi> vpi;
typedef vector<pl> vpl;
typedef vector<pd> vpd;

#define mp make_pair
#define f first
#define s second
#define sz(x) (int)(x).size()
#define all(x) begin(x), end(x)
#define rall(x) (x).rbegin(), (x).rend()
#define rsz resize
#define ins insert
#define ft front()
#define bk back()
#define pf push_front
#define pb push_back
#define eb emplace_back
#define lb lower_bound
#define ub upper_bound

#define FOR(i, a, b) for (int i = (a); i < (b); ++i)
#define F0R(i, a) FOR(i, 0, a)
#define ROF(i, a, b) for (int i = (b)-1; i >= (a); --i)
#define R0F(i, a) ROF(i, 0, a)
#define trav(a, x) for (auto &a : x)

const int MX = 1e3 + 5;
const int MOD = 1e9 + 7; // 998244353;
const ll INF = 1e18;
const ld PI = acos((ld)-1);

const int xd[4] = {1, 0, -1, 0}, yd[4] = {0, 1, 0, -1};
mt19937 rng((uint32_t)chrono::steady_clock::now().time_since_epoch().count());

template <class T> bool ckmin(T &a, const T &b) { return b < a ? a = b, 1 : 0; }
template <class T> bool ckmax(T &a, const T &b) { return a < b ? a = b, 1 : 0; }

constexpr int pct(int x) { return __builtin_popcount(x); }  // number of ones
constexpr int bits(int x) { return 31 - __builtin_clz(x); } // floor(log2(x))
template <class T> T cdiv(T a, T b) {
  return a / b + !(a < 0 || a % b == 0);
} // division of a by b rounded up, assumes b > 0

int fstTrue(function<bool(int)> f, int lo, int hi) {
  hi++;
  assert(lo <= hi); // assuming f is increasing
  while (lo < hi) { // find first index such that f is true
    int mid = (lo + hi) / 2;
    f(mid) ? hi = mid : lo = mid + 1;
  }
  return lo;
}

template <class T> void remDup(vector<T> &v) {
  sort(all(v));
  v.erase(unique(all(v)), end(v));
}

// DEBUG
void DBG() { cerr << "]" << endl; }
template <class H, class... T> void DBG(H h, T... t) {
  cerr << h;
  if (sizeof...(t))
    cerr << ", ";
  DBG(t...);
}
#define dbg(...)                                                               \\
  cerr << "LINE(" << __LINE__ << ") -> [" << #__VA_ARGS__ << "]: [",           \\
      DBG(__VA_ARGS__)

// FILE I/O
void setIn(str S) { freopen(S.c_str(), "r", stdin); }
void setOut(str S) { freopen(S.c_str(), "w", stdout); }
void setIO(str S = "") {
  ios_base::sync_with_stdio(0);
  cin.tie(0); // fast I/O
  // cin.exceptions(cin.failbit);
  // throws exception when do smth illegal
  // ex. try to read letter into int
  if (sz(S)) {
    setIn(S + ".in"), setOut(S + ".out");
  } // for USACO
}

int N, M;
char arr[MX][MX];
int dist[MX][MX];

bool ok(int x, int y) { return x >= 1 && x <= N && y >= 1 && y <= M; }

void bfs(int x, int y) {
  queue<pi> todo;
  todo.push({x, y});
  dist[x][y] = 0;
  while (sz(todo)) {
    auto cur = todo.ft;
    todo.pop();
    F0R(i, 4) {
      int nx = cur.f + xd[i];
      int ny = cur.s + yd[i];

      if (!ok(nx, ny) || arr[nx][ny] == '#')
        continue;
      if (dist[nx][ny] > dist[cur.f][cur.s]) {
        dist[nx][ny] = dist[cur.f][cur.s];
        todo.push({nx, ny});
      }
    }

    FOR(i, -2, 3) {
      FOR(j, -2, 3) {
        int nx = cur.f + i;
        int ny = cur.s + j;

        if (!ok(nx, ny) || arr[nx][ny] == '#')
          continue;
        if (dist[nx][ny] > dist[cur.f][cur.s] + 1) {
          dist[nx][ny] = dist[cur.f][cur.s] + 1;
          todo.push({nx, ny});
        }
      }
    }
  }
}

int32_t main() {

  setIO();

  cin >> N >> M;

  pi st, en;
  cin >> st.f >> st.s >> en.f >> en.s;

  FOR(i, 1, N + 1) FOR(j, 1, M + 1) {
    cin >> arr[i][j];
    dist[i][j] = MOD;
  }

  bfs(st.f, st.s);

  if (dist[en.f][en.s] == MOD)
    dist[en.f][en.s] = -1;

  cout << dist[en.f][en.s] << "\\n";
}