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

#include <algorithm>
#include <deque>
#include <iostream>
#include <string>
#include <vector>

#define ll long long
#define REP(i, n) for (int i = 0; i < n; i++)

using namespace std;
using P = pair<int, int>;

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

int main(void) {
  /*
  BFSで解くよ
  スタートからいけるところに「0」を書く
  いけなくなったら，「0」からいけるところに「1」を書く
  01-BFS　コストが0と1しかないので　それ以外ならダイクストラを使う
  01-BFSを実現するためには，deque（デック）を使うといい　ダイクストラはデータのプッシュにO(log
  N)かかっちゃうのでdequeで
  */

  int h, w;
  cin >> h >> w;
  int ch, cw, dh, dw;
  cin >> ch >> cw;
  cin >> dh >> dw;
  ch--;
  cw--;
  dh--;
  dw--;

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

  const int INF = 1e9;
  vector<vector<int>> dist(h, vector<int>(w, INF));

  deque<P> q;
  dist[ch][cw] = 0;
  // pair<int, int> p = make_pair(ch, cw);
  q.emplace_back(ch, cw); // emplace_backはほとんどpush_back
  // q.push_back(p);

  while (!q.empty()) {
    // 前から取り出す
    int i = q.front().first;
    int j = q.front().second;
    q.pop_front();
    int d = dist[i][j];

    // コスト0の移動
    REP(dir, 4) {
      int newi = i + dx[dir], newj = j + dy[dir];
      if (newi < 0 || newi >= h || newj < 0 || newj >= w)
        continue;
      if (s[newi][newj] == '#')
        continue;

      // そもそも距離が更新できないなら遷移する意味ない
      if (dist[newi][newj] <= d)
        continue;

      dist[newi][newj] = d;
      // pair<int, int> p = make_pair(newi, newj);
      q.emplace_front(newi, newj);
      // q.push_front(p);
    }

    // コスト1の移動
    for (int ei = -2; ei <= 2; ei++) {
      for (int ej = -2; ej <= 2; ej++) {
        int newi = i + ei, newj = j + ej;

        if (newi < 0 || newi >= h || newj < 0 || newj >= w)
          continue;
        if (s[newi][newj] == '#')
          continue;

        if (dist[newi][newj] <= d + 1)
          continue;

        dist[newi][newj] = d + 1;
        // pair<int, int> p = make_pair(newi, newj);
        q.emplace_back(newi, newj);
        // q.push_back(p);
      }
    }
  }

  int ans = dist[dh][dw];
  if (ans == INF)
    ans = -1;
  cout << ans << endl;

  return 0;
}


Error: TLE

Fixed submission:

#include <algorithm>
#include <cstdio>
#include <deque>
#include <iostream>
#include <map>
#include <math.h>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <string.h>
#include <string>
#include <tuple>
#include <unordered_map>
#include <vector>
using namespace std;
#define sim template <class c
#define ris return *this
#define dor > debug &operator<<
#define eni(x)                                                                 \\
  sim > typename enable_if<sizeof dud<c>(0) x 1, debug &>::type operator<<(    \\
            c i) {
sim > struct rge {
  c b, e;
};
sim > rge<c> range(c i, c j) { return rge<c>{i, j}; }
sim > auto dud(c *x) -> decltype(cerr << *x, 0);
sim > char dud(...);
struct debug {
#ifdef LOCAL
  ~debug() { cerr << endl; }
  eni(!=) cerr << boolalpha << i;
  ris;
} eni(==) ris << range(begin(i), end(i));
}
sim, class b dor(pair<b, c> d) {
  ris << "(" << d.first << ", " << d.second << ")";
}
sim dor(rge<c> d) {
  *this << "[";
  for (auto it = d.b; it != d.e; ++it)
    *this << ", " + 2 * (it == d.b) << *it;
  ris << "]";
}
#else
  sim dor(const c &) { ris; }
#endif
}
;
#define pp(...) "\\033[94m [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "]\\033[0m"
#define pp1(...)                                                               \\
  "\\033[1;47;35m" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "]\\033[0m"
#define dg(x) debug() << pp1(x)
#define dg1(x) debug() << "[line : " << __LINE__ << "]" << pp(x)
#define dg2(x, y) debug() << "[line : " << __LINE__ << "]" << pp(x) pp(y)
#define dg3(x, y, z)                                                           \\
  debug() << "[line : " << __LINE__ << "]" << pp(x) pp(y) pp(z)
#define dg4(w, x, y, z)                                                        \\
  debug() << "[line : " << __LINE__ << "]" << pp(w) pp(x) pp(y) pp(z)
#define int long long
#define all(x) x.begin(), x.end()
#define clr(x, y) memset(x, y, sizeof x);
#define sz(x) (int)x.size()
template <typename T> void db(T x) { debug() << ">>> " << x; }
template <typename T> void db(T x, T y) {
  debug() << ">>> " << x << " , " << y;
}
template <typename T> void db(T x, T y, T z) {
  debug() << ">>> " << x << " , " << y << " , " << z;
}
template <typename T> void db(T x, T y, T z, T a) {
  debug() << ">>> " << x << " , " << y << " , " << z << " , " << a;
}
// const int xx = 2e5;
const int Mod = 1e9 + 7;
const int inf = 1e18;
const int Maxn = 20010;
vector<int> fx = {+0, +0, +1, -1, -1, +1, -1, +1};
vector<int> fy = {-1, +1, +0, +0, +1, +1, -1, -1};
const int dirx[] = {+1, -1, +0, +0};
const int diry[] = {+0, +0, +1, -1};
signed main() {
  ios::sync_with_stdio(false);
  cin.tie(0);

  int N, M;
  cin >> N >> M;
  int sx, sy, dx, dy;
  cin >> sx >> sy >> dx >> dy;
  sx--, sy--, dx--, dy--;
  string g[N];
  for (int i = 0; i < N; i++) {
    cin >> g[i];
  }
  vector<vector<int>> dp(N, vector<int>(M, inf));
  deque<pair<int, int>> q;

  q.emplace_back(sx, sy);
  dp[sx][sy] = 0;

  auto valid = [&](int x, int y) {
    if (x >= 0 && x < N && y >= 0 && y < M && g[x][y] == '.') {
      return 1ll;
    }
    return 0ll;
  };
  while (!q.empty()) {
    auto px = q.front().first;
    auto py = q.front().second;
    q.pop_front();
    for (int i = 0; i < 4; i++) {
      int xx = px + dirx[i], yy = py + diry[i];
      if (valid(xx, yy) && dp[xx][yy] > dp[px][py]) {
        dp[xx][yy] = dp[px][py];
        q.emplace_back(xx, yy);
      }
    }
    for (int i = -2; i <= 2; i++) {
      for (int j = -2; j <= 2; j++) {
        int x = px + i;
        int y = py + j;
        if (valid(x, y) && dp[x][y] > dp[px][py] + 1) {
          dp[x][y] = dp[px][py] + 1;
          q.emplace_back(x, y);
        }
      }
    }
  }
  int ans = dp[dx][dy];
  if (ans == inf)
    ans = -1;
  cout << ans << '\\n';
}