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

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

#define M 1000000007
#define FOR(i, s, n) for (ll i = (s); i < (n); ++i)
#define FORALL(i, n) for (ll i = 0; i < (n); ++i)
#define MOD 1000000007
#define ff first
#define ss second
#define pll pair<long long, long long>
#define pii pair<int, int>
#define fast ios_base::sync_with_stdio(false)
#define countbits(x) __builtin_popcount(x)
#define pb(x) push_back((x))
#define vll vector<ll>
#define all(x) x.begin(), x.end()
#define print(x) cout << x << endl
#define debug print("reaching\\n")
#define mll map<ll, ll>
#define lsb(i) i & (-i)
#define printv(x)                                                              \\
  FORALL(i, x.size()) { cout << x[i] << ' '; }                                 \\
  cout << endl;
#define input(v, x)                                                            \\
  FORALL(i, n) { cin >> v[i]; };
#define printm(m)                                                              \\
  for (auto i : m) {                                                           \\
    cout << i.ff << ' ' << i.ss << endl;                                       \\
  };
// vector<map<ll,ll>> m(2);
long long binpow(long long a, long long b) {
  if (b <= 0)
    return 1;
  long long res = 1;
  while (b > 0) {
    if (b & 1)
      res = res * a;
    a = a * a;
    b >>= 1;
  }
  return res;
}

// vll start;
// vll finish;
// vll ft;
// void dfs(vector<vll>& g, ll cur, ll par){
//     static ll timer = 0;
//     ft[timer] = cur;
//     start[cur] = timer;
//     timer++;
//     for(int i = 0; i < g[cur].size(); i++)
//         if(g[cur][i] != par)
//             dfs(g, g[cur][i], cur);
//     finish[cur] = timer;
//     ft[timer] = cur;
//     timer++;
// }

// node st[4*(1000001)];
// int lazy[4*(1000001)];

// void build(int si, int ss, int se){
// 	if(ss == se){
// 		st[si].a[0] = 1;
// 		st[si].a[1] = 0;
// 		st[si].a[2] = 0;
// 		return;
// 	}
// 	int mid = (ss+se)/2;
// 	build(2*si, ss, mid);
// 	build(2*si + 1, mid+1,se);
// 	st[si].a[0] = st[2*si].a[0] + st[2*si + 1].a[0];
// 	st[si].a[1] = st[2*si].a[1] + st[2*si + 1].a[1];
// 	st[si].a[2] = st[2*si].a[2] + st[2*si + 1].a[2];
// }

// void update(int si, int ss, int se, int qs, int qe){
// 	if(lazy[si]!= 0){
// 		int add = lazy[si];
// 		lazy[si]%=3;
// 		FORALL(i,lazy[si]){
// 			swap(st[si].a[0], st[si].a[1]);
// 			swap(st[si].a[0], st[si].a[2]);
// 		}
// 		if(ss!=se){
// 			lazy[2*si] += add;
// 			lazy[2*si+1] += add;
// 		}
// 		lazy[si] = 0;
// 	}
// 	if(ss>qe or qs>se) return;
// 	if(ss>=qs and qe>=se){
// 		swap(st[si].a[0], st[si].a[1]);
// 		swap(st[si].a[0], st[si].a[2]);
// 		if(ss!=se){
// 			lazy[2*si]++;
// 			lazy[2*si+1]++;
// 		}
// 		return;
// 	}
// 	int mid = (ss + se)/2;
// 	update(2*si, ss, mid, qs, qe);
// 	update(2*si+1, mid+1, se, qs, qe);
// 	st[si].a[0] = st[2*si].a[0] + st[2*si + 1].a[0];
// 	st[si].a[1] = st[2*si].a[1] + st[2*si + 1].a[1];
// 	st[si].a[2] = st[2*si].a[2] + st[2*si + 1].a[2];
// }

// int get(int si, int ss, int se, int qs, int qe){
// 	if(lazy[si]!= 0){
// 		int add = lazy[si];
// 		lazy[si]%=3;
// 		FORALL(i,lazy[si]){
// 			swap(st[si].a[0], st[si].a[1]);
// 			swap(st[si].a[0], st[si].a[2]);
// 		}
// 		if(ss!=se){
// 			lazy[2*si] += add;
// 			lazy[2*si+1] += add;
// 		}
// 		lazy[si] = 0;
// 	}
// 	if(ss>qe or qs>se) return 0;
// 	if(ss>=qs and qe>=se){
// 		return st[si].a[0];
// 	}
// 	int mid = (ss + se)/2;
// 	int left = get(2*si, ss, mid, qs, qe);
// 	int right = get(2*si+1, mid+1, se, qs, qe);
// 	return left + right;
// }

template <typename T> T extGcd(T a, T b, T &x, T &y) {
  if (b == 0) {
    x = 1;
    y = 0;
    return a;
  } else {
    int g = extGcd(b, a % b, y, x);
    y -= a / b * x;
    return g;
  }
}

template <typename T> T modInv(T a, T m) {
  T x, y;
  extGcd(a, m, x, y);
  return (x % m + m) % m;
}

// ll fac[1000005];
// ll ifac[1000005];
// void temp(){
// 		fac[0] = fac[1] = 1;
// 		ifac[0] = ifac[1] = 1;
// 		for(int i=1;i< 1000005;i++){
// 			fac[i] = (fac[i-1]%MOD)*(i%MOD);
// 			fac[i] += MOD;
// 			fac[i]%=MOD;
// 			ifac[i] = (ifac[i-1]%MOD)*(modInv(i, MOD)%MOD);
// 			ifac[i] += MOD;
// 			ifac[i]%=MOD;
// 		}
// }
// ll cc(int n, int r){
// 	if(n==0) return 0;
// 	if(n==1) return 1;
// 	ll ans = (fac[n] * ifac[n-r])%MOD;
// 	ans = ans * ifac[r];
// 	ans%=MOD;
// 	return ans;
// }

bool safe(int x, int y, int n, int m) {
  if (x >= 0 and y >= 0 and x < n and y < m)
    return true;
  else
    return false;
}
int main() {
  fast;
  cin.tie(0);
  cout.tie(0);
  // #ifndef ONLINE_JUDGE
  // freopen("input.txt", "r", stdin);
  // freopen("output.txt", "w", stdout);
  // #endif

  int t = 1;
  // cin>>t;
  ll tot = t;
  while (t--) {
    ll n, m;
    cin >> n >> m;
    ll a[2];
    cin >> a[0] >> a[1];
    ll b[2];
    cin >> b[0] >> b[1];
    char mat[n][m];
    FORALL(i, n) {
      FORALL(j, m) { cin >> mat[i][j]; }
    }
    deque<pair<pii, int>> q;
    int r[4] = {0, -1, 1, 0};
    int c[4] = {1, 0, 0, -1};
    q.push_front({{a[0] - 1, a[1] - 1}, 0});
    map<pii, int> vis;
    while (q.size()) {
      pair<pii, int> x = q.front();
      q.pop_front();
      if (vis[x.ff]) {
        continue;
      }
      vis[x.ff] = 1;
      // cout<<x.ff.ff<<' '<<x.ff.ss<<endl;
      if (x.ff.ff == b[0] - 1 and x.ff.ss == b[1] - 1) {
        cout << x.ss << '\\n';
        return 0;
      }
      FORALL(i, 4) {
        if (safe(x.ff.ff + r[i], x.ff.ss + c[i], n, m)) {
          int nx = x.ff.ff + r[i];
          int ny = x.ff.ss + c[i];
          if (nx == b[0] - 1 and ny == b[1] - 1) {
            print(x.ss);
            return 0;
          }
          if (vis[{nx, ny}])
            continue;
          if (mat[nx][ny] == '.') {
            q.push_front({{nx, ny}, x.ss});
            // vis[{nx,ny}] = 1;
            continue;
          }
          for (int j = x.ff.ff - 2; j <= x.ff.ff + 2; j++) {
            for (int k = x.ff.ss - 2; k <= x.ff.ss + 2; k++) {
              if (!safe(j, k, n, m))
                continue;
              if (j == x.ff.ff and k == x.ff.ss)
                continue;
              if (mat[j][k] == '.') {
                // if(j == b[0]-1 and k == b[1]-1){
                // 	print(x.ss + 1);
                // 	return 0;
                // }
                q.push_back({{j, k}, x.ss + 1});
                // vis[{j,k}] = 1;
              }
            }
          }
        }
      }
    }
    print(-1);
  }
  return 0;
}
// string s;
// cin>>s;
// int last = -1;
// int ans = 0;
// int n = s.length();
// int dp[n][2];
// memset(dp, 0, sizeof(dp));
// for(int i =0; i<n;i++){
// 	if(s[i]==s[(i-1+n)%n]){
// 		dp[i][1] = (1 + dp[(i-1+n)%n][0]);
// 		dp[i][0] = dp[(i-1+n)%n][1];
// 	}
// 	else{
// 		dp[i][1] = dp[(i-1+n)%n][1] + 1;
// 		dp[i][0] = dp[(i-1+n)%n][0];
// 	}
// }
// // cout<<dp[n-1][0]<<' '<<dp[n-1][1]<<endl;
// ans = min(dp[n-1][0], dp[n-1][1]);
// if(n!=2 and dp[n-1][1]<=dp[n-1][0] and s[0]==s[n-1]){
// 	ans--;
// }
// print(ans);

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

#define M 1000000007
#define FOR(i, s, n) for (ll i = (s); i < (n); ++i)
#define FORALL(i, n) for (ll i = 0; i < (n); ++i)
#define MOD 1000000007
#define ff first
#define ss second
#define pll pair<long long, long long>
#define pii pair<int, int>
#define fast ios_base::sync_with_stdio(false)
#define countbits(x) __builtin_popcount(x)
#define pb(x) push_back((x))
#define vll vector<ll>
#define all(x) x.begin(), x.end()
#define print(x) cout << x << endl
#define debug print("reaching\\n")
#define mll map<ll, ll>
#define lsb(i) i & (-i)
#define printv(x)                                                              \\
  FORALL(i, x.size()) { cout << x[i] << ' '; }                                 \\
  cout << endl;
#define input(v, x)                                                            \\
  FORALL(i, n) { cin >> v[i]; };
#define printm(m)                                                              \\
  for (auto i : m) {                                                           \\
    cout << i.ff << ' ' << i.ss << endl;                                       \\
  };
// vector<map<ll,ll>> m(2);
long long binpow(long long a, long long b) {
  if (b <= 0)
    return 1;
  long long res = 1;
  while (b > 0) {
    if (b & 1)
      res = res * a;
    a = a * a;
    b >>= 1;
  }
  return res;
}

// vll start;
// vll finish;
// vll ft;
// void dfs(vector<vll>& g, ll cur, ll par){
//     static ll timer = 0;
//     ft[timer] = cur;
//     start[cur] = timer;
//     timer++;
//     for(int i = 0; i < g[cur].size(); i++)
//         if(g[cur][i] != par)
//             dfs(g, g[cur][i], cur);
//     finish[cur] = timer;
//     ft[timer] = cur;
//     timer++;
// }

// node st[4*(1000001)];
// int lazy[4*(1000001)];

// void build(int si, int ss, int se){
// 	if(ss == se){
// 		st[si].a[0] = 1;
// 		st[si].a[1] = 0;
// 		st[si].a[2] = 0;
// 		return;
// 	}
// 	int mid = (ss+se)/2;
// 	build(2*si, ss, mid);
// 	build(2*si + 1, mid+1,se);
// 	st[si].a[0] = st[2*si].a[0] + st[2*si + 1].a[0];
// 	st[si].a[1] = st[2*si].a[1] + st[2*si + 1].a[1];
// 	st[si].a[2] = st[2*si].a[2] + st[2*si + 1].a[2];
// }

// void update(int si, int ss, int se, int qs, int qe){
// 	if(lazy[si]!= 0){
// 		int add = lazy[si];
// 		lazy[si]%=3;
// 		FORALL(i,lazy[si]){
// 			swap(st[si].a[0], st[si].a[1]);
// 			swap(st[si].a[0], st[si].a[2]);
// 		}
// 		if(ss!=se){
// 			lazy[2*si] += add;
// 			lazy[2*si+1] += add;
// 		}
// 		lazy[si] = 0;
// 	}
// 	if(ss>qe or qs>se) return;
// 	if(ss>=qs and qe>=se){
// 		swap(st[si].a[0], st[si].a[1]);
// 		swap(st[si].a[0], st[si].a[2]);
// 		if(ss!=se){
// 			lazy[2*si]++;
// 			lazy[2*si+1]++;
// 		}
// 		return;
// 	}
// 	int mid = (ss + se)/2;
// 	update(2*si, ss, mid, qs, qe);
// 	update(2*si+1, mid+1, se, qs, qe);
// 	st[si].a[0] = st[2*si].a[0] + st[2*si + 1].a[0];
// 	st[si].a[1] = st[2*si].a[1] + st[2*si + 1].a[1];
// 	st[si].a[2] = st[2*si].a[2] + st[2*si + 1].a[2];
// }

// int get(int si, int ss, int se, int qs, int qe){
// 	if(lazy[si]!= 0){
// 		int add = lazy[si];
// 		lazy[si]%=3;
// 		FORALL(i,lazy[si]){
// 			swap(st[si].a[0], st[si].a[1]);
// 			swap(st[si].a[0], st[si].a[2]);
// 		}
// 		if(ss!=se){
// 			lazy[2*si] += add;
// 			lazy[2*si+1] += add;
// 		}
// 		lazy[si] = 0;
// 	}
// 	if(ss>qe or qs>se) return 0;
// 	if(ss>=qs and qe>=se){
// 		return st[si].a[0];
// 	}
// 	int mid = (ss + se)/2;
// 	int left = get(2*si, ss, mid, qs, qe);
// 	int right = get(2*si+1, mid+1, se, qs, qe);
// 	return left + right;
// }

template <typename T> T extGcd(T a, T b, T &x, T &y) {
  if (b == 0) {
    x = 1;
    y = 0;
    return a;
  } else {
    int g = extGcd(b, a % b, y, x);
    y -= a / b * x;
    return g;
  }
}

template <typename T> T modInv(T a, T m) {
  T x, y;
  extGcd(a, m, x, y);
  return (x % m + m) % m;
}

// ll fac[1000005];
// ll ifac[1000005];
// void temp(){
// 		fac[0] = fac[1] = 1;
// 		ifac[0] = ifac[1] = 1;
// 		for(int i=1;i< 1000005;i++){
// 			fac[i] = (fac[i-1]%MOD)*(i%MOD);
// 			fac[i] += MOD;
// 			fac[i]%=MOD;
// 			ifac[i] = (ifac[i-1]%MOD)*(modInv(i, MOD)%MOD);
// 			ifac[i] += MOD;
// 			ifac[i]%=MOD;
// 		}
// }
// ll cc(int n, int r){
// 	if(n==0) return 0;
// 	if(n==1) return 1;
// 	ll ans = (fac[n] * ifac[n-r])%MOD;
// 	ans = ans * ifac[r];
// 	ans%=MOD;
// 	return ans;
// }

bool safe(int x, int y, int n, int m) {
  if (x >= 0 and y >= 0 and x < n and y < m)
    return true;
  else
    return false;
}
int main() {
  fast;
  cin.tie(0);
  cout.tie(0);
  // #ifndef ONLINE_JUDGE
  // freopen("input.txt", "r", stdin);
  // freopen("output.txt", "w", stdout);
  // #endif

  int t = 1;
  // cin>>t;
  ll tot = t;
  while (t--) {
    ll n, m;
    cin >> n >> m;
    ll a[2];
    cin >> a[0] >> a[1];
    ll b[2];
    cin >> b[0] >> b[1];
    char mat[n][m];
    FORALL(i, n) {
      FORALL(j, m) { cin >> mat[i][j]; }
    }
    deque<pair<pii, int>> q;
    int r[4] = {0, -1, 1, 0};
    int c[4] = {1, 0, 0, -1};
    q.push_front({{a[0] - 1, a[1] - 1}, 0});
    map<pii, int> vis;
    while (q.size()) {
      pair<pii, int> x = q.front();
      q.pop_front();
      // cout<<x.ff.ff<<' '<<x.ff.ss<<endl;
      if (x.ff.ff == b[0] - 1 and x.ff.ss == b[1] - 1) {
        cout << x.ss << '\\n';
        return 0;
      }
      FORALL(i, 4) {
        if (safe(x.ff.ff + r[i], x.ff.ss + c[i], n, m)) {
          int nx = x.ff.ff + r[i];
          int ny = x.ff.ss + c[i];
          if (nx == b[0] - 1 and ny == b[1] - 1) {
            print(x.ss);
            return 0;
          }
          if (vis[{nx, ny}])
            continue;
          if (mat[nx][ny] == '.') {
            q.push_front({{nx, ny}, x.ss});
            vis[{nx, ny}] = 1;
            continue;
          }
          for (int j = x.ff.ff - 2; j <= x.ff.ff + 2; j++) {
            for (int k = x.ff.ss - 2; k <= x.ff.ss + 2; k++) {
              if (!safe(j, k, n, m))
                continue;
              if (j == x.ff.ff and k == x.ff.ss)
                continue;
              if (mat[j][k] == '.') {
                if (j == b[0] - 1 and k == b[1] - 1) {
                  print(x.ss + 1);
                  return 0;
                }
                q.push_back({{j, k}, x.ss + 1});
                vis[{j, k}] = 1;
              }
            }
          }
        }
      }
    }
    print(-1);
  }
  return 0;
}
// string s;
// cin>>s;
// int last = -1;
// int ans = 0;
// int n = s.length();
// int dp[n][2];
// memset(dp, 0, sizeof(dp));
// for(int i =0; i<n;i++){
// 	if(s[i]==s[(i-1+n)%n]){
// 		dp[i][1] = (1 + dp[(i-1+n)%n][0]);
// 		dp[i][0] = dp[(i-1+n)%n][1];
// 	}
// 	else{
// 		dp[i][1] = dp[(i-1+n)%n][1] + 1;
// 		dp[i][0] = dp[(i-1+n)%n][0];
// 	}
// }
// // cout<<dp[n-1][0]<<' '<<dp[n-1][1]<<endl;
// ans = min(dp[n-1][0], dp[n-1][1]);
// if(n!=2 and dp[n-1][1]<=dp[n-1][0] and s[0]==s[n-1]){
// 	ans--;
// }
// print(ans);