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

#include "bits/stdc++.h"

#define REP(i, n) for (ll i = 0; i < n; ++i)
#define RREP(i, n) for (ll i = n - 1; i >= 0; --i)
#define FOR(i, m, n) for (ll i = m; i < n; ++i)
#define RFOR(i, m, n) for (ll i = n - 1; i >= m; --i)
#define ALL(v) (v).begin(), (v).end()
#define PB(a) push_back(a)
#define UNIQUE(v) v.erase(unique(ALL(v)), v.end());
#define DUMP(v)                                                                \\
  REP(aa, (v).size()) {                                                        \\
    cout << v[a];                                                              \\
    if (a != v.size() - 1)                                                     \\
      cout << " ";                                                             \\
    else                                                                       \\
      cout << endl;                                                            \\
  }
#define INF 1000000001ll
#define MOD 1000000007ll
#define EPS 1e-9

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

using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<vi> vvi;
typedef vector<vl> vvl;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
ll max(ll a, int b) { return max(a, ll(b)); }
ll max(int a, ll b) { return max(ll(a), b); }
ll min(ll a, int b) { return min(a, ll(b)); }
ll min(int a, ll b) { return min(ll(a), b); }
///(?´????????`)(?´????????`)(?´????????`)(?´????????`)(?´????????`)(?´????????`)///
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  int h, w;
  cin >> h >> w;
  vector<string> v(h);
  vi x, y;
  REP(i, h) cin >> v[i];
  int sx, sy, tx, ty;
  REP(i, h) {
    REP(j, w) {
      if (v[i][j] == '@') {
        sy = i;
        sx = j;
      } else if (v[i][j] == '$') {
        y.push_back(i);
        x.push_back(j);
      } else if (v[i][j] == '%') {
        ty = i;
        tx = j;
      }
    }
  }
  int n = x.size();
  vvi mp(h, vi(w, INF));
  mp[ty][tx] = 0;
  queue<pii> q;
  q.push({tx, ty});
  while (!q.empty()) {
    pii p = q.front();
    q.pop();
    REP(i, 4) {
      int nx = p.first + dx[i * 2], ny = p.second + dy[i * 2];
      if (nx >= 0 && ny >= 0 && ny < h && nx < w && v[ny][nx] != '#' &&
          mp[ny][nx] == INF) {
        mp[ny][nx] = mp[p.second][p.first] + 1;
        q.push({nx, ny});
      }
    }
  }
  int p = mp[sy][sx], s = INF;
  REP(i, n) { s = min(s, mp[y[i]][x[i]]); }
  if (p < s)
    cout << "Yes" << endl;
  else
    cout << "No" << endl;
  return 0;
}

Error: TLE

Fixed submission:

#include "bits/stdc++.h"

#define REP(i, n) for (ll i = 0; i < n; ++i)
#define RREP(i, n) for (ll i = n - 1; i >= 0; --i)
#define FOR(i, m, n) for (ll i = m; i < n; ++i)
#define RFOR(i, m, n) for (ll i = n - 1; i >= m; --i)
#define ALL(v) (v).begin(), (v).end()
#define PB(a) push_back(a)
#define UNIQUE(v) v.erase(unique(ALL(v)), v.end());
#define DUMP(v)                                                                \\
  REP(aa, (v).size()) {                                                        \\
    cout << v[a];                                                              \\
    if (a != v.size() - 1)                                                     \\
      cout << " ";                                                             \\
    else                                                                       \\
      cout << endl;                                                            \\
  }
#define INF 1000000001ll
#define MOD 1000000007ll
#define EPS 1e-9

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

using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<vi> vvi;
typedef vector<vl> vvl;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
ll max(ll a, int b) { return max(a, ll(b)); }
ll max(int a, ll b) { return max(ll(a), b); }
ll min(ll a, int b) { return min(a, ll(b)); }
ll min(int a, ll b) { return min(ll(a), b); }
///(?´????????`)(?´????????`)(?´????????`)(?´????????`)(?´????????`)(?´????????`)///
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  int h, w;
  cin >> h >> w;
  vector<string> v(h);
  vi x, y;
  REP(i, h) cin >> v[i];
  int sx, sy, tx, ty;
  REP(i, h) {
    REP(j, w) {
      if (v[i][j] == '@') {
        sy = i;
        sx = j;
      } else if (v[i][j] == '$') {
        y.push_back(i);
        x.push_back(j);
      } else if (v[i][j] == '%') {
        ty = i;
        tx = j;
      }
    }
  }
  int n = x.size();
  vvi mp(h, vi(w, INF));
  mp[sy][sx] = 0;
  queue<pii> q;
  q.push({sx, sy});
  while (!q.empty()) {
    pii p = q.front();
    q.pop();
    REP(i, 4) {
      int nx = p.first + dx[i * 2], ny = p.second + dy[i * 2];
      if (nx >= 0 && ny >= 0 && ny < h && nx < w && v[ny][nx] != '#' &&
          mp[ny][nx] == INF) {
        mp[ny][nx] = mp[p.second][p.first] + 1;
        q.push({nx, ny});
      }
    }
  }
  vvi ms(h, vi(w, INF));
  vvi tmp(h, vi(w, INF));
  REP(i, n) {
    //	int cnt = 0;

    q.push({x[i], y[i]});
    tmp[y[i]][x[i]] = 0;
    while (!q.empty()) {
      pii p = q.front();
      q.pop();
      if (ms[p.second][p.first] <= tmp[p.second][p.first])
        continue;
      ms[p.second][p.first] =
          min(ms[p.second][p.first], tmp[p.second][p.first]);
      REP(i, 4) {
        int nx = p.first + dx[i * 2], ny = p.second + dy[i * 2];
        if (nx >= 0 && ny >= 0 && ny < h && nx < w && v[ny][nx] != '#' &&
            tmp[ny][nx] == INF) {
          tmp[ny][nx] = tmp[p.second][p.first] + 1;
          q.push({nx, ny});
          // cout << cnt <<" "<<nx<<" "<<ny<< endl;
          // cnt++;
        }
      }
    }
    REP(i, h) {
      REP(j, w) { tmp[i][j] = INF; }
    }
  }
  if (ms[ty][tx] > mp[ty][tx])
    cout << "Yes" << endl;
  else
    cout << "No" << endl;
  return 0;
}