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

#include <bits/stdc++.h>
using namespace std;
using LL = long long int;
// テンプレテスト中
#define incII(i, l, r) for (LL i = (l); i <= (r); i++)
#define incID(i, l, r) for (LL i = (l); i < (r); i++)
#define incCI(i, l, r) for (LL i = (l) + 1; i <= (r); i++)
#define incCD(i, l, r) for (LL i = (l) + 1; i < (r); i++)
#define decII(i, l, r) for (LL i = (r); i >= (l); i--)
#define decID(i, l, r) for (LL i = (r)-1; i >= (l); i--)
#define decCI(i, l, r) for (LL i = (r); i > (l); i--)
#define decCD(i, l, r) for (LL i = (r)-1; i > (l); i--)
#define inc(i, n) incID(i, 0, n)
#define dec(i, n) decID(i, 0, n)
#define inc1(i, n) incII(i, 1, n)
#define dec1(i, n) decII(i, 1, n)
auto inII = [](auto v, auto l, auto r) { return (l <= v && v <= r); };
auto inID = [](auto v, auto l, auto r) { return (l <= v && v < r); };
auto inCI = [](auto v, auto l, auto r) { return (l < v && v <= r); };
auto inCD = [](auto v, auto l, auto r) { return (l < v && v < r); };
#define PB push_back
#define EB emplace_back
#define MP make_pair
#define MT make_tuple
#define FI first
#define SE second
#define FR front()
#define BA back()
#define ALL(v) v.begin(), v.end()
#define RALL(v) v.rbegin(), v.rend()
auto setmin = [](auto &a, auto b) { return (b < a ? a = b, true : false); };
auto setmax = [](auto &a, auto b) { return (b > a ? a = b, true : false); };
auto setmineq = [](auto &a, auto b) { return (b <= a ? a = b, true : false); };
auto setmaxeq = [](auto &a, auto b) { return (b >= a ? a = b, true : false); };
#define SC static_cast
#define SI(v) SC<int>(v.size())
#define SL(v) SC<LL>(v.size())
#define RF(e, v) for (auto &e : v)
#define until(e) while (!(e))
#define if_not(e) if (!(e))
#define ef else if
#define UR assert(false)
#define CT continue
#define RV(v) reverse(ALL(v))
auto *IS = &cin;
// input elements (as a tuple)
template <typename U, int I> void in_(U &t) {}
template <typename U, int I, typename A, typename... B> void in_(U &t) {
  (*IS) >> get<I>(t);
  in_<U, I + 1, B...>(t);
}
template <typename... T> auto in() {
  tuple<T...> t;
  in_<tuple<T...>, 0, T...>(t);
  return t;
}
// input an array
template <typename T, int N> auto ain() {
  array<T, N> a;
  inc(i, N) { (*IS) >> a[i]; }
  return a;
}
// input a (multi-dimensional) vector
template <typename T> T vin() {
  T v;
  (*IS) >> v;
  return v;
}
template <typename T, typename N, typename... M> auto vin(N n, M... m) {
  vector<decltype(vin<T, M...>(m...))> v(n);
  inc(i, n) { v[i] = vin<T, M...>(m...); }
  return v;
}
// input multi-column (as a tuple of vector)
template <typename U, int I> void colin_(U &t) {}
template <typename U, int I, typename A, typename... B> void colin_(U &t) {
  A a;
  (*IS) >> a;
  get<I>(t).push_back(a);
  colin_<U, I + 1, B...>(t);
}
template <typename... T> auto colin(int n) {
  tuple<vector<T>...> t;
  inc(i, n) { colin_<tuple<vector<T>...>, 0, T...>(t); }
  return t;
}
auto *OS = &cout;
// output elements
void out_(string s) {}
template <typename A> void out_(string s, A &&a) { (*OS) << a; }
template <typename A, typename... B> void out_(string s, A &&a, B &&...b) {
  (*OS) << a << s;
  out_(s, b...);
}
auto outF = [](auto x, auto y, auto z, auto... a) {
  (*OS) << x;
  out_(y, a...);
  (*OS) << z << flush;
};
auto out = [](auto... a) { outF("", " ", "\\n", a...); };
auto outS = [](auto... a) { outF("", " ", " ", a...); };
auto outL = [](auto... a) { outF("", "\\n", "\\n", a...); };
auto outN = [](auto... a) { outF("", "", "", a...); };
array<string, 3> SEQ_FMT = {"", " ", ""};
auto &SEQ_BEG = SEQ_FMT[0];
auto &SEQ_MID = SEQ_FMT[1];
auto &SEQ_END = SEQ_FMT[2];
// output a (multi-dimensional) vector
template <typename T> ostream &operator<<(ostream &os, vector<T> const &v) {
  os << SEQ_BEG;
  inc(i, v.size()) { os << (i == 0 ? "" : SEQ_MID) << v[i]; }
  return (os << SEQ_END);
}
template <typename T> void vout_(T &&v) { (*OS) << v; }
template <typename T, typename A, typename... B>
void vout_(T &&v, A a, B... b) {
  inc(i, v.size()) {
    (*OS) << (i == 0 ? "" : a);
    vout_(v[i], b...);
  }
}
template <typename T, typename A, typename... B> void vout(T &&v, A a, B... b) {
  vout_(v, b...);
  (*OS) << a << flush;
}

// ---- ----

template <typename T> T MV(T v) { return v; }
template <typename T, typename... U> auto MV(T v, int a, U... b) {
  return vector<decltype(MV(v, b...))>(a, MV(v, b...));
}

template <typename T> using LPQ = priority_queue<T, vector<T>, greater<T>>;

int main() {
  auto [h, w, si, sj, gi, gj] = ain<int, 6>();
  si--;
  sj--;
  gi--;
  gj--;
  auto s = vin<string>(h);

  const int INF = 1e7;
  auto d = MV<int>(INF, h, w);
  auto f = MV<int>(0, h, w);
  LPQ<tuple<int, int, int>> q;
  auto add = [&](int i, int j, int k) {
    if (setmin(d[i][j], k)) {
      f[i][j] = 1;
      q.emplace(k, i, j);
    }
  };

  add(si, sj, 0);
  until(q.empty()) {
    auto [dd, i, j] = q.top();
    q.pop();
    if_not(d[i][j] == dd && f[i][j] == 1) { CT; }
    f[i][j] = 0;

    vector<int> di = {+1, 0, -1, 0, +1, +1, -1, -1, 0};
    vector<int> dj = {0, +1, 0, -1, +1, -1, +1, -1, 0};
    inc(k, 4) {
      int ii = i + di[k];
      int jj = j + dj[k];
      if_not(inID(ii, 0, h) && inID(jj, 0, w) && s[ii][jj] == '.') { continue; }
      add(ii, jj, dd);
    }
    incII(I, -2, +2) {
      incII(J, -2, +2) {
        int ii = i + I;
        int jj = j + J;
        if_not(inID(ii, 0, h) && inID(jj, 0, w) && s[ii][jj] == '.') {
          continue;
        }
        add(ii, jj, dd + 1);
      }
    }
  }
  int ans = d[gi][gj];
  if (ans == INF) {
    ans = -1;
  }
  out(ans);
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
using LL = long long int;
// テンプレテスト中
#define incII(i, l, r) for (LL i = (l); i <= (r); i++)
#define incID(i, l, r) for (LL i = (l); i < (r); i++)
#define incCI(i, l, r) for (LL i = (l) + 1; i <= (r); i++)
#define incCD(i, l, r) for (LL i = (l) + 1; i < (r); i++)
#define decII(i, l, r) for (LL i = (r); i >= (l); i--)
#define decID(i, l, r) for (LL i = (r)-1; i >= (l); i--)
#define decCI(i, l, r) for (LL i = (r); i > (l); i--)
#define decCD(i, l, r) for (LL i = (r)-1; i > (l); i--)
#define inc(i, n) incID(i, 0, n)
#define dec(i, n) decID(i, 0, n)
#define inc1(i, n) incII(i, 1, n)
#define dec1(i, n) decII(i, 1, n)
auto inII = [](auto v, auto l, auto r) { return (l <= v && v <= r); };
auto inID = [](auto v, auto l, auto r) { return (l <= v && v < r); };
auto inCI = [](auto v, auto l, auto r) { return (l < v && v <= r); };
auto inCD = [](auto v, auto l, auto r) { return (l < v && v < r); };
#define PB push_back
#define EB emplace_back
#define MP make_pair
#define MT make_tuple
#define FI first
#define SE second
#define FR front()
#define BA back()
#define ALL(v) v.begin(), v.end()
#define RALL(v) v.rbegin(), v.rend()
auto setmin = [](auto &a, auto b) { return (b < a ? a = b, true : false); };
auto setmax = [](auto &a, auto b) { return (b > a ? a = b, true : false); };
auto setmineq = [](auto &a, auto b) { return (b <= a ? a = b, true : false); };
auto setmaxeq = [](auto &a, auto b) { return (b >= a ? a = b, true : false); };
#define SC static_cast
#define SI(v) SC<int>(v.size())
#define SL(v) SC<LL>(v.size())
#define RF(e, v) for (auto &e : v)
#define until(e) while (!(e))
#define if_not(e) if (!(e))
#define ef else if
#define UR assert(false)
#define CT continue
#define RV(v) reverse(ALL(v))
auto *IS = &cin;
// input elements (as a tuple)
template <typename U, int I> void in_(U &t) {}
template <typename U, int I, typename A, typename... B> void in_(U &t) {
  (*IS) >> get<I>(t);
  in_<U, I + 1, B...>(t);
}
template <typename... T> auto in() {
  tuple<T...> t;
  in_<tuple<T...>, 0, T...>(t);
  return t;
}
// input an array
template <typename T, int N> auto ain() {
  array<T, N> a;
  inc(i, N) { (*IS) >> a[i]; }
  return a;
}
// input a (multi-dimensional) vector
template <typename T> T vin() {
  T v;
  (*IS) >> v;
  return v;
}
template <typename T, typename N, typename... M> auto vin(N n, M... m) {
  vector<decltype(vin<T, M...>(m...))> v(n);
  inc(i, n) { v[i] = vin<T, M...>(m...); }
  return v;
}
// input multi-column (as a tuple of vector)
template <typename U, int I> void colin_(U &t) {}
template <typename U, int I, typename A, typename... B> void colin_(U &t) {
  A a;
  (*IS) >> a;
  get<I>(t).push_back(a);
  colin_<U, I + 1, B...>(t);
}
template <typename... T> auto colin(int n) {
  tuple<vector<T>...> t;
  inc(i, n) { colin_<tuple<vector<T>...>, 0, T...>(t); }
  return t;
}
auto *OS = &cout;
// output elements
void out_(string s) {}
template <typename A> void out_(string s, A &&a) { (*OS) << a; }
template <typename A, typename... B> void out_(string s, A &&a, B &&...b) {
  (*OS) << a << s;
  out_(s, b...);
}
auto outF = [](auto x, auto y, auto z, auto... a) {
  (*OS) << x;
  out_(y, a...);
  (*OS) << z << flush;
};
auto out = [](auto... a) { outF("", " ", "\\n", a...); };
auto outS = [](auto... a) { outF("", " ", " ", a...); };
auto outL = [](auto... a) { outF("", "\\n", "\\n", a...); };
auto outN = [](auto... a) { outF("", "", "", a...); };
array<string, 3> SEQ_FMT = {"", " ", ""};
auto &SEQ_BEG = SEQ_FMT[0];
auto &SEQ_MID = SEQ_FMT[1];
auto &SEQ_END = SEQ_FMT[2];
// output a (multi-dimensional) vector
template <typename T> ostream &operator<<(ostream &os, vector<T> const &v) {
  os << SEQ_BEG;
  inc(i, v.size()) { os << (i == 0 ? "" : SEQ_MID) << v[i]; }
  return (os << SEQ_END);
}
template <typename T> void vout_(T &&v) { (*OS) << v; }
template <typename T, typename A, typename... B>
void vout_(T &&v, A a, B... b) {
  inc(i, v.size()) {
    (*OS) << (i == 0 ? "" : a);
    vout_(v[i], b...);
  }
}
template <typename T, typename A, typename... B> void vout(T &&v, A a, B... b) {
  vout_(v, b...);
  (*OS) << a << flush;
}

// ---- ----

template <typename T> T MV(T v) { return v; }
template <typename T, typename... U> auto MV(T v, int a, U... b) {
  return vector<decltype(MV(v, b...))>(a, MV(v, b...));
}

int main() {
  auto [h, w, si, sj, gi, gj] = ain<int, 6>();
  si--;
  sj--;
  gi--;
  gj--;
  auto s = vin<string>(h);

  const int INF = 1e7;
  auto d = MV<int>(INF, h, w);
  queue<tuple<int, int, int>> q;
  auto add = [&](int i, int j, int k) {
    if (k < d[i][j]) {
      q.emplace(i, j, k);
    }
  };

  add(si, sj, 0);
  until(q.empty()) {
    auto [i, j, dd] = q.front();
    q.pop();
    if_not(dd < d[i][j]) { CT; }
    d[i][j] = dd;

    vector<int> di = {+1, 0, -1, 0, +1, +1, -1, -1, 0};
    vector<int> dj = {0, +1, 0, -1, +1, -1, +1, -1, 0};
    inc(k, 4) {
      int ii = i + di[k];
      int jj = j + dj[k];
      if_not(inID(ii, 0, h) && inID(jj, 0, w) && s[ii][jj] == '.') { continue; }
      add(ii, jj, dd);
    }
    incII(I, -2, +2) {
      incII(J, -2, +2) {
        int ii = i + I;
        int jj = j + J;
        if_not(inID(ii, 0, h) && inID(jj, 0, w) && s[ii][jj] == '.') {
          continue;
        }
        add(ii, jj, dd + 1);
      }
    }
  }
  int ans = d[gi][gj];
  if (ans == INF) {
    ans = -1;
  }
  out(ans);
}