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

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define F first
#define S second
#define pii pair<int, int>
#define pli pair<ll, int>
#define pil pair<int, ll>
#define pll pair<ll, ll>
#define eb emplace_back
#define all(v) v.begin(), v.end()
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define rep3(i, l, n) for (int i = l; i < (n); ++i)
#define sz(v) (int)v.size()
#define endl '\\n'
const int inf = 1000000007;
const ll INF = 1e18;
// int mod = 998244353;
int mod = 1000000007;
const double eps = 1e-8;
#define abs(x) (x >= 0 ? x : -(x))
#define lb(v, x) (int)(lower_bound(all(v), x) - v.begin())
#define ub(v, x) (int)(upper_bound(all(v), x) - v.begin())
template <typename T1, typename T2> inline bool chmin(T1 &a, T2 b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
template <typename T1, typename T2> inline bool chmax(T1 &a, T2 b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
ll gcd(ll a, ll b) {
  if (b == 0)
    return a;
  return gcd(b, a % b);
}
ll lcm(ll a, ll b) { return a / gcd(a, b) * b; }
template <typename T, typename U> T pow_(T a, U b) {
  return b ? pow_(a * a, b / 2) * (b % 2 ? a : 1) : 1;
}
ll modpow(ll a, ll b, ll _mod) {
  return b ? modpow(a * a % _mod, b / 2, _mod) * (b % 2 ? a : 1) % _mod : 1;
}
template <class T, class U>
ostream &operator<<(ostream &os, const pair<T, U> &p) {
  os << p.F << " " << p.S;
  return os;
}
template <class T> ostream &operator<<(ostream &os, const vector<T> &vec) {
  rep(i, sz(vec)) {
    if (i)
      os << " ";
    os << vec[i];
  }
  return os;
}
template <class T> ostream &operator<<(ostream &os, const set<T> &s) {
  for (auto si : s)
    os << si << " ";
  return os;
}
template <typename T> inline istream &operator>>(istream &is, vector<T> &v) {
  rep(j, sz(v)) is >> v[j];
  return is;
}
template <class T, class T2> inline void add(T &a, T2 b) {
  (a += (b % mod + mod)) %= mod;
}
template <class T> void operator+=(vector<T> &v, vector<T> v2) {
  rep(i, sz(v2)) v.eb(v2[i]);
}

void solve();

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cout << fixed << setprecision(12);
  int T;
  T = 1;
  while (T--)
    solve();
}

void solve() {
  int h, w;
  cin >> h >> w;
  int sy, sx, gy, gx;
  cin >> sy >> sx >> gy >> gx;
  --sy;
  --sx;
  --gy;
  --gx;
  vector<vector<int>> a(h, vector<int>(w));
  rep(i, h) rep(j, w) {
    char c;
    cin >> c;
    a[i][j] = (c == '.' ? 0 : 1);
  }

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

  vector<vector<int>> to(h, vector<int>(w, -1));
  int cnt = 0;
  rep(i, h) rep(j, w) {
    if (to[i][j] != -1 || a[i][j] == 1)
      continue;
    to[i][j] = cnt++;
    queue<pii> q;
    q.emplace(i, j);
    while (!q.empty()) {
      int y = q.front().F, x = q.front().S;
      q.pop();
      rep(k, 4) {
        int ny = y + dy[k];
        int nx = x + dx[k];
        if (ny < 0 || ny >= h || nx < 0 || nx >= w)
          continue;
        if (a[ny][nx] == 1)
          continue;
        if (to[ny][nx] == -1) {
          to[ny][nx] = to[y][x];
          q.emplace(ny, nx);
        }
      }
    }
  }
  // rep(i, h) cerr << to[i] << endl;

  set<int> s[cnt];
  rep(y, h) rep(x, w) {
    if (a[y][x] == 1)
      continue;
    rep3(ny, y - 2, y + 3) rep3(nx, x - 2, x + 3) {
      if (ny < 0 || ny >= h || nx < 0 || nx >= w)
        continue;
      if (a[ny][nx] == 1)
        continue;
      if (to[y][x] != to[ny][nx]) {
        // cerr << to[y][x] << " " << to[ny][nx] << endl;
        s[to[y][x]].emplace(to[ny][nx]);
        s[to[ny][nx]].emplace(to[y][x]);
      }
    }
  }
  vector<vector<pil>> G(cnt);
  rep(i, cnt) for (auto e : s[i]) G[i].eb(e, 1);

  int st = to[sy][sx], ed = to[gy][gx];
  auto dijkstra = [&](int s) {
    vector<ll> d(cnt, INF);
    priority_queue<pli, vector<pli>, greater<pli>> q;

    d[s] = 0;
    q.emplace(0, s);

    while (!q.empty()) {
      pli p = q.top();
      q.pop();

      int v = p.S;
      if (d[v] < p.F)
        continue;
      rep(i, sz(G[v])) {
        int nv = G[v][i].F;
        ll cost = G[v][i].S;
        if (chmin(d[nv], d[v] + cost)) {
          q.emplace(d[nv], nv);
        }
      }
    }
    return d;
  };
  auto d = dijkstra(st);
  cout << (d[ed] == INF ? -1 : d[ed]) << endl;
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define F first
#define S second
#define pii pair<int, int>
#define pli pair<ll, int>
#define pil pair<int, ll>
#define pll pair<ll, ll>
#define eb emplace_back
#define all(v) v.begin(), v.end()
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define rep3(i, l, n) for (int i = l; i < (n); ++i)
#define sz(v) (int)v.size()
#define endl '\\n'
const int inf = 1000000007;
const ll INF = 1e18;
// int mod = 998244353;
int mod = 1000000007;
const double eps = 1e-8;
#define abs(x) (x >= 0 ? x : -(x))
#define lb(v, x) (int)(lower_bound(all(v), x) - v.begin())
#define ub(v, x) (int)(upper_bound(all(v), x) - v.begin())
template <typename T1, typename T2> inline bool chmin(T1 &a, T2 b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
template <typename T1, typename T2> inline bool chmax(T1 &a, T2 b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
ll gcd(ll a, ll b) {
  if (b == 0)
    return a;
  return gcd(b, a % b);
}
ll lcm(ll a, ll b) { return a / gcd(a, b) * b; }
template <typename T, typename U> T pow_(T a, U b) {
  return b ? pow_(a * a, b / 2) * (b % 2 ? a : 1) : 1;
}
ll modpow(ll a, ll b, ll _mod) {
  return b ? modpow(a * a % _mod, b / 2, _mod) * (b % 2 ? a : 1) % _mod : 1;
}
template <class T, class U>
ostream &operator<<(ostream &os, const pair<T, U> &p) {
  os << p.F << " " << p.S;
  return os;
}
template <class T> ostream &operator<<(ostream &os, const vector<T> &vec) {
  rep(i, sz(vec)) {
    if (i)
      os << " ";
    os << vec[i];
  }
  return os;
}
template <class T> ostream &operator<<(ostream &os, const set<T> &s) {
  for (auto si : s)
    os << si << " ";
  return os;
}
template <typename T> inline istream &operator>>(istream &is, vector<T> &v) {
  rep(j, sz(v)) is >> v[j];
  return is;
}
template <class T, class T2> inline void add(T &a, T2 b) {
  (a += (b % mod + mod)) %= mod;
}
template <class T> void operator+=(vector<T> &v, vector<T> v2) {
  rep(i, sz(v2)) v.eb(v2[i]);
}

void solve();

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cout << fixed << setprecision(12);
  int T;
  T = 1;
  while (T--)
    solve();
}

void solve() {
  int h, w;
  cin >> h >> w;
  int sy, sx, gy, gx;
  cin >> sy >> sx >> gy >> gx;
  --sy;
  --sx;
  --gy;
  --gx;
  vector<vector<int>> a(h, vector<int>(w));
  rep(i, h) rep(j, w) {
    char c;
    cin >> c;
    a[i][j] = (c == '.' ? 0 : 1);
  }

  queue<pii> q;
  q.emplace(sy, sx);

  vector<vector<int>> d(h, vector<int>(w, inf));
  d[sy][sx] = 0;

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

  while (!q.empty()) {
    int y = q.front().F, x = q.front().S;
    q.pop();
    rep(k, 4) {
      int ny = y + dy[k];
      int nx = x + dx[k];
      if (ny < 0 || ny >= h || nx < 0 || nx >= w)
        continue;
      if (a[ny][nx] == 1)
        continue;
      if (chmin(d[ny][nx], d[y][x])) {
        q.emplace(ny, nx);
      }
    }
    rep3(ny, y - 2, y + 3) rep3(nx, x - 2, x + 3) {
      if (ny < 0 || ny >= h || nx < 0 || nx >= w)
        continue;
      if (a[ny][nx] == 1)
        continue;
      if (chmin(d[ny][nx], d[y][x] + 1)) {
        q.emplace(ny, nx);
      }
    }
  }
  cout << (d[gy][gx] == inf ? -1 : d[gy][gx]) << endl;
}