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

#include <bits/stdc++.h>
#define rep(i, s, n) for (int i = s; i < n; i++)
#define rp(i, n) for (int i = 0; i < n; i++)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(), (x).end()
#define all_acc(x) (x).begin(), (x).end(), 0LL
#define int long long
#define absSort(v)                                                             \\
  sort(a.begin(), a.end(),                                                     \\
       [](int i, int j) -> bool { return abs(i) < abs(j); });
using namespace std;
using P = pair<int, int>;
using Graph = vector<vector<int>>;
using ll = long long;
double pi = 3.14159265359;

template <class T, class U> void chmin(T &t, const U &u) {
  if (t > u)
    t = u;
}
template <class T, class U> void chmax(T &t, const U &u) {
  if (t < u)
    t = u;
}

// 出力するよ
void output_tate(vector<int> s) {
  int n = s.size();
  for (int i = 0; i < n; i++) {
    // if (i != 0)
    //     cout << " ";
    cout << s[i] << endl;
  }
  // cout << endl;
}

void output_yoko(vector<int> s) {
  int n = s.size();
  for (int i = 0; i < n; i++) {
    if (i != 0)
      cout << " ";
    cout << s[i]; //<<endl;
  }
  cout << endl;
}

void output_yoko(vector<char> s) {
  int n = s.size();
  for (int i = 0; i < n; i++) {
    if (i != 0)
      cout << " ";
    cout << s[i]; //<<endl;
  }
  cout << endl;
}

// 01BFS
// edgesは重み付きグラフ
// disは、とても大きい数で初期化する必要がある
void bfs01(vector<int> &dis, vector<vector<pair<int, int>>> edges, int s) {
  int n = dis.size();
  dis[s] = 0;
  deque<int> que;
  que.push_back(s);

  while (que.size()) {
    int i = que.front();
    que.pop_front();
    for (auto p : edges[i]) {
      int j = p.first;
      int c = p.second;
      int d = dis[i] + c;
      if (d < dis[j]) {
        dis[j] = d;
        if (c) {
          que.push_back(j);
        } else {
          que.push_front(j);
        }
      }
    }
  }
}

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

signed main() {
  int h, w;
  cin >> h >> w;
  int ch, cw;
  cin >> ch >> cw;
  int dh, dw;
  cin >> dh >> dw;
  vector<vector<pair<int, int>>> G(h * w);
  vector<int> dis(h * w);
  ch--;
  cw--;
  dh--;
  dw--;
  vector<vector<char>> grid(h, vector<char>(w));

  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      char ci;
      cin >> ci;
      grid[i][j] = ci;
    }
  }

  for (int i = 0; i < h; i++)
    for (int j = 0; j < w; j++) {
      if (grid[i][j] == '#')
        continue;
      for (int k = 0; k < 4; k++) {
        // cout<<"apa"<<endl;
        int ni = i + dy[k];
        int nj = j + dx[k];
        if (ni < 0 || ni >= h || nj < 0 || nj >= w)
          continue;
        if (grid[ni][nj] == '#')
          continue;
        G[w * i + j].push_back({w * ni + nj, 0});
        // cout<<"a"<<endl;
      }
      for (int ni = i - 2; ni <= i + 2; ni++) {
        for (int nj = j - 2; nj <= j + 2; nj++) {
          if (ni < 0 || ni >= h || nj < 0 || nj >= w)
            continue;
          if (grid[ni][nj] == '#')
            continue;
          G[w * i + j].push_back({w * ni + nj, 1});
          // cout<<"b"<<endl;
        }
      }
      // cout<<"c"<<endl;
    }

  // cout<<1<<endl;

  rp(i, h * w) dis[i] = 10000000000;
  bfs01(dis, G, w * ch + cw);
  int ans = dis[w * dh + dw];
  if (ans == 10000000000)
    cout << -1 << endl;
  else
    cout << ans << endl;
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#define rep(i, s, n) for (int i = s; i < n; i++)
#define rp(i, n) for (int i = 0; i < n; i++)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(), (x).end()
#define all_acc(x) (x).begin(), (x).end(), 0LL
#define int long long
#define absSort(v)                                                             \\
  sort(a.begin(), a.end(),                                                     \\
       [](int i, int j) -> bool { return abs(i) < abs(j); });
using namespace std;
using P = pair<int, int>;
using Graph = vector<vector<int>>;
using ll = long long;
double pi = 3.14159265359;

template <class T, class U> void chmin(T &t, const U &u) {
  if (t > u)
    t = u;
}
template <class T, class U> void chmax(T &t, const U &u) {
  if (t < u)
    t = u;
}

// 出力するよ
void output_tate(vector<int> s) {
  int n = s.size();
  for (int i = 0; i < n; i++) {
    // if (i != 0)
    //     cout << " ";
    cout << s[i] << endl;
  }
  // cout << endl;
}

void output_yoko(vector<int> s) {
  int n = s.size();
  for (int i = 0; i < n; i++) {
    if (i != 0)
      cout << " ";
    cout << s[i]; //<<endl;
  }
  cout << endl;
}

void output_yoko(vector<char> s) {
  int n = s.size();
  for (int i = 0; i < n; i++) {
    if (i != 0)
      cout << " ";
    cout << s[i]; //<<endl;
  }
  cout << endl;
}

// 01BFS
// edgesは重み付きグラフ
// disは、とても大きい数で初期化する必要がある
void bfs01(vector<int> &dis, vector<vector<pair<int, int>>> edges, int s) {
  int n = dis.size();
  dis[s] = 0;
  deque<int> que;
  que.push_back(s);

  while (que.size()) {
    int i = que.front();
    que.pop_front();
    for (auto [j, c] : edges[i]) {
      int d = dis[i] + c;
      if (d < dis[j]) {
        dis[j] = d;
        if (c) {
          que.push_back(j);
        } else {
          que.push_front(j);
        }
      }
    }
  }
}

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

signed main() {
  int h, w;
  cin >> h >> w;
  int ch, cw;
  cin >> ch >> cw;
  int dh, dw;
  cin >> dh >> dw;
  vector<vector<pair<int, int>>> G(h * w);
  vector<int> dis(h * w);
  ch--;
  cw--;
  dh--;
  dw--;
  vector<vector<char>> grid(h, vector<char>(w));

  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      char ci;
      cin >> ci;
      grid[i][j] = ci;
    }
  }

  for (int i = 0; i < h; i++)
    for (int j = 0; j < w; j++) {
      if (grid[i][j] == '#')
        continue;
      rp(k, 4) {
        int ni = i + dy[k];
        int nj = j + dx[k];
        if (ni < 0 || ni >= h || nj < 0 || nj >= w)
          continue;
        if (grid[ni][nj] == '#')
          continue;
        G[w * i + j].push_back({w * ni + nj, 0});
      }
      for (int ni = i - 2; ni <= i + 2; i++) {
        for (int nj = j - 2; nj <= j + 2; j++) {
          if (ni < 0 || ni >= h || nj < 0 || nj >= w)
            continue;
          if (grid[ni][nj] == '#')
            continue;
          G[w * i + j].push_back({w * ni + nj, 0});
        }
      }
    }
  rp(i, h * w) dis[i] = 10000000000;
  bfs01(dis, G, w * ch + cw);
  int ans = dis[w * dh + dw];
  if (ans == 10000000000)
    cout << -1 << endl;
  else
    cout << ans << endl;
}