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

#include <bits/stdc++.h>
#define ll long long
#define ALL(x) x.begin(), x.end()
#define MOD (1000000000 + 7)
using namespace std;
#define PI 3.14159265359
#define tMOD 998244353
#define mkpr(x, y) make_pair(x, y)
ll H, W;
ll ch, cw, dh, dw;
char field[10000][10000];
ll dp[10000][10000];

priority_queue<pair<ll, pair<ll, ll>>, vector<pair<ll, pair<ll, ll>>>

               >
    que;
int main() {

  cin >> H >> W;

  cin >> ch >> cw >> dh >> dw;
  ch--;
  cw--;
  dw--;
  dh--;

  for (ll i = 0; i < H; i++) {
    for (ll j = 0; j < W; j++) {
      cin >> field[i][j];
    }
  }
  for (ll i = 0; i < 10000; i++) {
    for (ll j = 0; j < 10000; j++) {
      dp[i][j] = 1111111122222;
    }
  }

  dp[ch][cw] = 0;

  // ser(ch,cw,0);
  que.push(mkpr(0LL, mkpr(ch, cw)));
  while (!(que.empty())) {
    pair<ll, pair<ll, ll>> tmpp = que.top();
    que.pop();
    ll nh = tmpp.second.first;
    ll nw = tmpp.second.second;

    if (nh - 1 >= 0 && field[nh - 1][nw] == '.') {
      if (dp[nh][nw] < dp[nh - 1][nw]) {
        dp[nh - 1][nw] = dp[nh][nw];
        que.push(mkpr(-dp[nh][nw], mkpr(nh - 1, nw)));
      }
    }
    // ↓
    if (nh + 1 < H && field[nh + 1][nw] == '.') {
      if (dp[nh][nw] < dp[nh + 1][nw]) {
        dp[nh + 1][nw] = dp[nh][nw];
        que.push(mkpr(-dp[nh][nw], mkpr(nh + 1, nw)));
      }
    }
    // 右
    if (nw + 1 < W && field[nh][nw + 1] == '.') {
      if (dp[nh][nw] < dp[nh][nw + 1]) {
        dp[nh][nw + 1] = dp[nh][nw];
        que.push(mkpr(-dp[nh][nw], mkpr(nh, nw + 1)));
      }
    }
    // 左
    if (nw - 1 >= 0 && field[nh][nw - 1] == '.') {
      if (dp[nh][nw] < dp[nh][nw - 1]) {
        dp[nh][nw - 1] = dp[nh][nw];
        que.push(mkpr(-dp[nh][nw], mkpr(nh, nw - 1)));
      }
    }
    // ワープ
    for (ll y = -2; y <= 2; y++) {
      for (ll x = -2; x <= 2; x++) {
        if (nw + x >= 0 && nw + x < W && nh + y < H && nh + y >= 0) {
          if (field[nh + y][nw + x] == '.') {
            if (dp[nh][nw] + 1 < dp[nh + y][nw + x]) {
              dp[nh + y][nw + x] = dp[nh][nw] + 1;
              que.push(mkpr((-1) * (dp[nh][nw] + 1), mkpr(nh + y, nw + x)));
            }
          }
        }
      }
    }
  }

  if (dp[dh][dw] == 1111111122222) {
    cout << -1 << endl;
    return 0;
  } else {
    cout << dp[dh][dw] << endl;
  }

  return 0;
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#define ll long long
#define ALL(x) x.begin(), x.end()
#define MOD (1000000000 + 7)
using namespace std;
#define PI 3.14159265359
#define tMOD 998244353
#define mkpr(x, y) make_pair(x, y)
ll H, W;
ll ch, cw, dh, dw;
char field[10000][10000];
ll dp[10000][10000];

ll ser(ll nh, ll nw, ll kai) {
  kai++;
  if (kai > 1000) {
    return 0;
  }

  // 上
  if (nh - 1 >= 0 && field[nh - 1][nw] == '.') {
    if (dp[nh][nw] < dp[nh - 1][nw]) {
      dp[nh - 1][nw] = dp[nh][nw];
      ser(nh - 1, nw, kai);
    }
  }
  // ↓
  if (nh + 1 < H && field[nh + 1][nw] == '.') {
    if (dp[nh][nw] < dp[nh + 1][nw]) {
      dp[nh + 1][nw] = dp[nh][nw];
      ser(nh + 1, nw, kai);
    }
  }
  // 右
  if (nw + 1 < W && field[nh][nw + 1] == '.') {
    if (dp[nh][nw] < dp[nh][nw + 1]) {
      dp[nh][nw + 1] = dp[nh][nw];
      ser(nh, nw + 1, kai);
    }
  }
  // 左
  if (nw - 1 >= 0 && field[nh][nw - 1] == '.') {
    if (dp[nh][nw] < dp[nh][nw - 1]) {
      dp[nh][nw - 1] = dp[nh][nw];
      ser(nh, nw - 1, kai);
    }
  }
  // ワープ
  for (ll y = -2; y <= 2; y++) {
    for (ll x = -2; x <= 2; x++) {
      if (nw + x >= 0 && nw + x < W && nh + y < H && nh + y >= 0) {
        if (field[nh + y][nw + x] == '.') {
          if (dp[nh][nw] + 1 < dp[nh + y][nw + x]) {
            dp[nh + y][nw + x] = dp[nh][nw] + 1;
            ser(nh + y, nw + x, kai);
          }
        }
      }
    }
  }
  return 0;
}

queue<pair<ll, ll>> que;
int main() {

  cin >> H >> W;

  cin >> ch >> cw >> dh >> dw;
  ch--;
  cw--;
  dw--;
  dh--;

  for (ll i = 0; i < H; i++) {
    for (ll j = 0; j < W; j++) {
      cin >> field[i][j];
    }
  }
  for (ll i = 0; i < 10000; i++) {
    for (ll j = 0; j < 10000; j++) {
      dp[i][j] = 1111111122222;
    }
  }

  dp[ch][cw] = 0;

  // ser(ch,cw,0);
  que.push(mkpr(ch, cw));

  while (!(que.empty())) {
    pair<ll, ll> tmpp = que.front();
    que.pop();
    ll nh = tmpp.first;
    ll nw = tmpp.second;

    if (nh - 1 >= 0 && field[nh - 1][nw] == '.') {
      if (dp[nh][nw] < dp[nh - 1][nw]) {
        dp[nh - 1][nw] = dp[nh][nw];
        que.push(mkpr(nh - 1, nw));
      }
    }
    // ↓
    if (nh + 1 < H && field[nh + 1][nw] == '.') {
      if (dp[nh][nw] < dp[nh + 1][nw]) {
        dp[nh + 1][nw] = dp[nh][nw];
        que.push(mkpr(nh + 1, nw));
      }
    }
    // 右
    if (nw + 1 < W && field[nh][nw + 1] == '.') {
      if (dp[nh][nw] < dp[nh][nw + 1]) {
        dp[nh][nw + 1] = dp[nh][nw];
        que.push(mkpr(nh, nw + 1));
      }
    }
    // 左
    if (nw - 1 >= 0 && field[nh][nw - 1] == '.') {
      if (dp[nh][nw] < dp[nh][nw - 1]) {
        dp[nh][nw - 1] = dp[nh][nw];
        que.push(mkpr(nh, nw - 1));
      }
    }
    // ワープ
    for (ll y = -2; y <= 2; y++) {
      for (ll x = -2; x <= 2; x++) {
        if (nw + x >= 0 && nw + x < W && nh + y < H && nh + y >= 0) {
          if (field[nh + y][nw + x] == '.') {
            if (dp[nh][nw] + 1 < dp[nh + y][nw + x]) {
              dp[nh + y][nw + x] = dp[nh][nw] + 1;
              que.push(mkpr(nh + y, nw + x));
            }
          }
        }
      }
    }
  }

  if (dp[dh][dw] == 1111111122222) {
    cout << -1 << endl;
    return 0;
  } else {
    cout << dp[dh][dw] << endl;
  }

  return 0;
}