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

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<vi> vvi;
typedef vector<string> vs;
typedef pair<int, int> pii;

#define sz(a) int((a).size())
#define pb push_back
#define eb emplace_back
#define fi first
#define se second
#define all(c) (c).begin(), (c).end()
#define rall(c) (c).rbegin(), (c).rend()
#define ini(a, i) memset(a, i, sizeof(a))
#define inin(a, n, i) memset(a, i, sizeof(a[0]) * (n))
#define contains(c, i) ((c).find(i) != (c).end())
#define present(i, c) (find(all(c), i) != (c).end())

#define trav(x, c) for (auto &x : c)
#define rep(i, n) for (int i = 0; i < n; i++)
#define repa(i, b, e)                                                          \\
  for (int i = (b) - ((b) > (e)); i != (e) - ((b) > (e));                      \\
       i += 1 - 2 * ((b) > (e)))

template <class T> bool chkmax(T &x, T y) {
  return x < y ? x = y, true : false;
}
template <class T> bool chkmin(T &x, T y) {
  return x > y ? x = y, true : false;
}
template <class A, class B> A cvt(B x) {
  stringstream s;
  s << x;
  A r;
  s >> r;
  return r;
}

void read() {}
void print() {}
template <class T, class... Args> void read(T &a, Args &...args) {
  cin >> a;
  read(args...);
}
template <class T, class... Args> void print(T a, Args... args) {
  cout << a << ' ';
  print(args...);
}
template <class... Args> void println(Args... args) {
  print(args...);
  cout << '\\n';
}

#define debug(args...)                                                         \\
  {                                                                            \\
    string s_(#args);                                                          \\
    replace(all(s_), ',', ' ');                                                \\
    stringstream ss_(s_);                                                      \\
    istream_iterator<string> it_(ss_);                                         \\
    cerr_(it_, args);                                                          \\
  }
void cerr_(istream_iterator<string> it) { (void)it; }
template <class T, class... Args>
void cerr_(istream_iterator<string> it, T a, Args... args) {
  cerr << *it << " = " << a << endl;
  cerr_(++it, args...);
}

template <class T, class S>
ostream &operator<<(ostream &os, const pair<T, S> &p) {
  os << "(" << p.first << ", " << p.second << ")";
  return os;
}
template <class T> ostream &operator<<(ostream &os, const vector<T> &v) {
  os << '{';
  string sep;
  for (const auto &x : v)
    os << sep << x, sep = ", ";
  return os << '}';
}
template <class T> ostream &operator<<(ostream &os, const set<T> &s) {
  os << '{';
  string sep;
  for (const auto &x : s)
    os << sep << x, sep = ", ";
  return os << '}';
}
template <class T, class S>
ostream &operator<<(ostream &os, const map<T, S> &m) {
  os << '{';
  string sep;
  for (const auto &x : m)
    os << sep << x, sep = ", ";
  return os << '}';
}
template <class T, size_t size>
ostream &operator<<(ostream &os, const array<T, size> &arr) {
  os << '{';
  string sep;
  for (const auto &x : arr)
    os << sep << x, sep = ", ";
  return os << '}';
}

const int INF = 0x3F3F3F3F;
const int MAXN = (int)1e3 + 1;
const int MOD = (int)1e9 + 7;

//=========================

int _dx[] = {1, 0, -1, 0};
int _dy[] = {0, 1, 0, -1};

int dist[MAXN][MAXN];

void run_test() {
  int h, w;
  read(h, w);
  int ch, cw;
  read(ch, cw);
  ch--;
  cw--;
  int dh, dw;
  read(dh, dw);
  dh--;
  dw--;
  vs mz(h);
  rep(i, h) read(mz[i]);

  ini(dist, 0x3F);

  priority_queue<pair<int, pii>, vector<pair<int, pii>>,
                 greater<pair<int, pii>>>
      q;
  q.push({0, {ch, cw}});
  dist[ch][cw] = 0;

  while (!q.empty()) {
    pair<int, pair<int, int>> p = q.top();
    q.pop();
    int d = p.fi;
    int x = p.se.fi, y = p.se.se;

    if (d > dist[x][y])
      continue;

    if (x == dh && y == dw)
      break;

    rep(k, 4) {
      int nx = x + _dx[k];
      int ny = y + _dy[k];
      if (nx < 0 || nx >= h || ny < 0 || ny >= w || mz[nx][ny] == '#')
        continue;
      if (dist[x][y] < dist[nx][ny]) {
        dist[nx][ny] = dist[x][y];
        q.push({dist[nx][ny], {nx, ny}});
      }
    }

    for (int dx = -2; dx <= 2; dx++) {
      for (int dy = -2; dy <= 2; dy++) {
        if (dx == 0 && dy == 0)
          continue;
        int nx = x + dx;
        int ny = y + dy;
        if (nx < 0 || nx >= h || ny < 0 || ny >= w || mz[nx][ny] == '#')
          continue;
        if (dist[x][y] + 1 < dist[nx][ny]) {
          dist[nx][ny] = dist[x][y] + 1;
          q.push({dist[nx][ny], {nx, ny}});
        }
      }
    }
  }

  int ans = (dist[dh][dw] == INF ? -1 : dist[dh][dw]);
  println(ans);
}

//=========================

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  // int t_ = 1, t__; cin >> t__; while(t_ <= t__) { cout << "Case #" << t_++ <<
  // ": "; run_test(); }
  //  int t_; cin >> t_; while(t_--) run_test();
  run_test();
  return 0;
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<vi> vvi;
typedef vector<string> vs;
typedef pair<int, int> pii;

#define sz(a) int((a).size())
#define pb push_back
#define eb emplace_back
#define fi first
#define se second
#define all(c) (c).begin(), (c).end()
#define rall(c) (c).rbegin(), (c).rend()
#define ini(a, i) memset(a, i, sizeof(a))
#define inin(a, n, i) memset(a, i, sizeof(a[0]) * (n))
#define contains(c, i) ((c).find(i) != (c).end())
#define present(i, c) (find(all(c), i) != (c).end())

#define trav(x, c) for (auto &x : c)
#define rep(i, n) for (int i = 0; i < n; i++)
#define repa(i, b, e)                                                          \\
  for (int i = (b) - ((b) > (e)); i != (e) - ((b) > (e));                      \\
       i += 1 - 2 * ((b) > (e)))

template <class T> bool chkmax(T &x, T y) {
  return x < y ? x = y, true : false;
}
template <class T> bool chkmin(T &x, T y) {
  return x > y ? x = y, true : false;
}
template <class A, class B> A cvt(B x) {
  stringstream s;
  s << x;
  A r;
  s >> r;
  return r;
}

void read() {}
void print() {}
template <class T, class... Args> void read(T &a, Args &...args) {
  cin >> a;
  read(args...);
}
template <class T, class... Args> void print(T a, Args... args) {
  cout << a << ' ';
  print(args...);
}
template <class... Args> void println(Args... args) {
  print(args...);
  cout << '\\n';
}

#define debug(args...)                                                         \\
  {                                                                            \\
    string s_(#args);                                                          \\
    replace(all(s_), ',', ' ');                                                \\
    stringstream ss_(s_);                                                      \\
    istream_iterator<string> it_(ss_);                                         \\
    cerr_(it_, args);                                                          \\
  }
void cerr_(istream_iterator<string> it) { (void)it; }
template <class T, class... Args>
void cerr_(istream_iterator<string> it, T a, Args... args) {
  cerr << *it << " = " << a << endl;
  cerr_(++it, args...);
}

template <class T, class S>
ostream &operator<<(ostream &os, const pair<T, S> &p) {
  os << "(" << p.first << ", " << p.second << ")";
  return os;
}
template <class T> ostream &operator<<(ostream &os, const vector<T> &v) {
  os << '{';
  string sep;
  for (const auto &x : v)
    os << sep << x, sep = ", ";
  return os << '}';
}
template <class T> ostream &operator<<(ostream &os, const set<T> &s) {
  os << '{';
  string sep;
  for (const auto &x : s)
    os << sep << x, sep = ", ";
  return os << '}';
}
template <class T, class S>
ostream &operator<<(ostream &os, const map<T, S> &m) {
  os << '{';
  string sep;
  for (const auto &x : m)
    os << sep << x, sep = ", ";
  return os << '}';
}
template <class T, size_t size>
ostream &operator<<(ostream &os, const array<T, size> &arr) {
  os << '{';
  string sep;
  for (const auto &x : arr)
    os << sep << x, sep = ", ";
  return os << '}';
}

const int INF = 0x3F3F3F3F;
const int MAXN = (int)1e3 + 1;
const int MOD = (int)1e9 + 7;

//=========================

int _dx[] = {1, 0, -1, 0};
int _dy[] = {0, 1, 0, -1};

int h, w;
vs mz;

vector<vector<bool>> vis;
vvi color;

vvi adj;

void dfs(int x, int y, int c) {
  if (vis[x][y])
    return;
  vis[x][y] = true;
  color[x][y] = c;
  rep(k, 4) {
    int nx = x + _dx[k];
    int ny = y + _dy[k];
    if (nx < 0 || nx >= h || ny < 0 || ny >= w || mz[nx][ny] == '#' ||
        vis[nx][ny])
      continue;
    dfs(nx, ny, c);
  }
}

void run_test() {
  read(h, w);
  int ch, cw;
  read(ch, cw);
  ch--;
  cw--;
  int dh, dw;
  read(dh, dw);
  dh--;
  dw--;
  mz.clear();
  mz.resize(h);
  rep(i, h) read(mz[i]);

  int c = 0;
  vis.clear();
  vis = vector<vector<bool>>(h, vector<bool>(w));
  color.clear();
  color = vector<vector<int>>(h, vector<int>(w, -1));
  rep(x, h) rep(y, w) if (!vis[x][y] && mz[x][y] != '#') dfs(x, y, c++);

  mz.clear();

  int ccolor = color[ch][cw];
  int dcolor = color[dh][dw];

  adj.clear();
  adj.resize(c);
  vis.clear();
  vis = vector<vector<bool>>(c, vector<bool>(c));
  rep(x, h) rep(y, w) if (color[x][y] != -1) {
    for (int dx = -2; dx <= 2; dx++) {
      for (int dy = -2; dy <= 2; dy++) {
        if (dx == 0 && dy == 0)
          continue;
        int nx = x + dx;
        int ny = y + dy;
        if (nx < 0 || nx >= h || ny < 0 || ny >= w)
          continue;
        if (color[nx][ny] == -1 || color[nx][ny] == color[x][y])
          continue;
        if (vis[color[x][y]][color[nx][ny]])
          continue;
        adj[color[x][y]].eb(color[nx][ny]);
        adj[color[nx][ny]].eb(color[x][y]);
        vis[color[x][y]][color[nx][ny]] = true;
        vis[color[nx][ny]][color[x][y]] = true;
      }
    }
  }

  color.clear();
  vis.clear();

  vi dist(c, INF);
  dist[ccolor] = 0;

  queue<int> q;
  q.push(ccolor);
  while (!q.empty()) {
    int t = q.front();
    q.pop();
    trav(k, adj[t]) if (dist[k] == INF) {
      dist[k] = dist[t] + 1;
      if (k == dcolor)
        goto end;
      q.push(k);
    }
  }
end:;

  int ans = (dist[dcolor] == INF ? -1 : dist[dcolor]);
  println(ans);
}

//=========================

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  // int t_ = 1, t__; cin >> t__; while(t_ <= t__) { cout << "Case #" << t_++ <<
  // ": "; run_test(); }
  //  int t_; cin >> t_; while(t_--) run_test();
  run_test();
  return 0;
}