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

#include <bits/stdc++.h>

using namespace std;
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
// using namespace __gnu_pbds;

// #define ordered_set tree<int, null_type,less<int>,
// rb_tree_tag,tree_order_statistics_node_update>

const int MOD = 1e9 + 7;
// const int MOD  = 998244353;
const int INF = 0x3f3f3f3f;
const double PI = 4 * atan(1);
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<double, double> pdd;
// struct custom_hash {
//     static uint64_t splitmix64(uint64_t x) {
//         // http://xorshift.di.unimi.it/splitmix64.c
//         x += 0x9e3779b97f4a7c15;
//         x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
//         x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
//         return x ^ (x >> 31);
//     }

//     size_t operator()(uint64_t x) const {
//         static const uint64_t FIXED_RANDOM =
//         chrono::steady_clock::now().time_since_epoch().count(); return
//         splitmix64(x + FIXED_RANDOM);
//     }
// };
// ll gcd(ll a, ll b) {
//     if (a == 0) return b;
//     return gcd(b % a, a);
// }
// ll mod(ll x) {
//     x%=MOD;
//     if(x<0)x+=MOD;
//     return x;
// }
// ll power(int base, int power) {
//     ll prod = 1;
//     ll b = base;
//     while(power) {
//         if (power & 1) {
//             prod = mod(prod*b);
//         }
//         b = mod(b*b);
//         power/=2;
//     }
//     return prod;
// }
struct line {
  ll m, c;
  ll eval(int x) { return 1LL * m * x + c; }
  double intersect(line l) { return (double)(c - l.c) / (l.m - m); }
};
// double degToRad(double x) {
//  return x * PI / 180;
// }
// double area(int a, int b, int c, int d, int e, int f) {
//  return abs(0.5*(a*(d-f)+c*(f-b)+e*(b-d)));
// }
// struct str{
//     string s;
//     ll h[100005];
//     ll p[100005];
//     ll base=37;
//     void hsh(){
//         h[0] = s[0]-'a';
//         p[0] = 1;
//         for(int i=1;i<s.length();i++){
//             h[i]=h[i-1]*base+s[i]-'a';
//             p[i]=p[i-1]*base;
//         }
//     }

//     ll getHash(int l,int r){
//         if(l==0) return h[r];
//         return h[r]-h[l-1]*p[r-l+1];
//     }

// };

// line sweep template
// https://cp-algorithms.com/geometry/intersecting_segments.html const ld EPS =
// 1E-12;

// struct pt {
//     ld x, y;
// };

// struct seg {
//     pt p, q;
//     int id;

//     ld get_y(double x) const {
//         if (abs(p.x - q.x) < EPS)
//             return p.y;
//         return p.y + (q.y - p.y) * (x - p.x) / (q.x - p.x);
//     }
// };

// bool intersect1d(ld l1, ld r1, ld l2, ld r2) {
//     if (l1 > r1)
//         swap(l1, r1);
//     if (l2 > r2)
//         swap(l2, r2);
//     return max(l1, l2) <= min(r1, r2) + EPS;
// }

// int vec(const pt& a, const pt& b, const pt& c) {
//     double s = (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);
//     return abs(s) < EPS ? 0 : s > 0 ? +1 : -1;
// }

// bool intersect(const seg& a, const seg& b)
// {
//     return intersect1d(a.p.x, a.q.x, b.p.x, b.q.x) &&
//            intersect1d(a.p.y, a.q.y, b.p.y, b.q.y) &&
//            vec(a.p, a.q, b.p) * vec(a.p, a.q, b.q) <= 0 &&
//            vec(b.p, b.q, a.p) * vec(b.p, b.q, a.q) <= 0;
// }

// bool operator<(const seg& a, const seg& b)
// {
//     ld x = max(min(a.p.x, a.q.x), min(b.p.x, b.q.x));
//     return a.get_y(x) < b.get_y(x) - EPS;
// }

// struct event {
//     ld x;
//     int tp, id;

//     event() {}
//     event(ld x, int tp, int id) : x(x), tp(tp), id(id) {}

//     bool operator<(const event& e) const {
//         if (abs(x - e.x) > EPS)
//             return x < e.x;
//         return tp > e.tp;
//     }
// };

// set<seg> s;
// vector<set<seg>::iterator> where;

// set<seg>::iterator prev(set<seg>::iterator it) {
//     return it == s.begin() ? s.end() : --it;
// }

// set<seg>::iterator next(set<seg>::iterator it) {
//     return ++it;
// }

// pair<int, int> solve(const vector<seg>& a) {
//     int n = (int)a.size();
//     vector<event> e;
//     for (int i = 0; i < n; ++i) {
//         e.push_back(event(min(a[i].p.x, a[i].q.x), +1, i));
//         e.push_back(event(max(a[i].p.x, a[i].q.x), -1, i));
//     }
//     sort(e.begin(), e.end());

//     s.clear();
//     where.resize(a.size());
//     for (size_t i = 0; i < e.size(); ++i) {
//         int id = e[i].id;
//         if (e[i].tp == +1) {
//             set<seg>::iterator nxt = s.lower_bound(a[id]), prv = prev(nxt);
//             if (nxt != s.end() && intersect(*nxt, a[id]))
//                 return make_pair(nxt->id, id);
//             if (prv != s.end() && intersect(*prv, a[id]))
//                 return make_pair(prv->id, id);
//             where[id] = s.insert(nxt, a[id]);
//         } else {
//             set<seg>::iterator nxt = next(where[id]), prv = prev(where[id]);
//             if (nxt != s.end() && prv != s.end() && intersect(*nxt, *prv))
//                 return make_pair(prv->id, nxt->id);
//             s.erase(where[id]);
//         }
//     }

//     return make_pair(-1, -1);
// }
int h, w, k, x[2], y[2];
void solve() {
  scanf("%d %d %d", &h, &w, &k);
  vector<vector<char>> grid(h + 1, vector<char>(w + 1));
  scanf("%d %d %d %d", &x[0], &y[0], &x[1], &y[1]);
  x[0]--, y[0]--, x[1]--, y[1]--;
  for (int i = 0; i < h; i++) {
    scanf("%c", &grid[i][0]);
    for (int j = 0; j < w; j++) {
      scanf("%c", &grid[i][j]);
    }
  }
  queue<pii> q;
  vector<vector<int>> dist(h + 1, vector<int>(w + 1, -1));
  dist[x[0]][y[0]] = 0;
  q.push({x[0], y[0]});
  while (!q.empty()) {
    pii cur = q.front();
    q.pop();
    for (int i = 1; i <= k; i++) {
      if (cur.first - i < 0 || grid[cur.first - i][cur.second] == '@') {
        break;
      }
      if (dist[cur.first - i][cur.second] == -1) {
        dist[cur.first - i][cur.second] = dist[cur.first][cur.second] + 1;
        q.push({cur.first - i, cur.second});
      } else if (dist[cur.first - 1][cur.second] <=
                 dist[cur.first][cur.second]) {
        break;
      }
    }
    for (int i = 1; i <= k; i++) {
      if (cur.first + i >= h || grid[cur.first + i][cur.second] == '@') {
        break;
      }
      if (dist[cur.first + i][cur.second] == -1) {
        dist[cur.first + i][cur.second] = dist[cur.first][cur.second] + 1;
        q.push({cur.first + i, cur.second});
      } else if (dist[cur.first + i][cur.second] <=
                 dist[cur.first][cur.second]) {
        break;
      }
    }
    for (int i = 1; i <= k; i++) {
      if (cur.second - i < 0 || grid[cur.first][cur.second - i] == '@') {
        break;
      }
      if (dist[cur.first][cur.second - i] == -1) {
        dist[cur.first][cur.second - i] = dist[cur.first][cur.second] + 1;
        q.push({cur.first, cur.second - i});
      } else if (dist[cur.first][cur.second - i] <=
                 dist[cur.first][cur.second]) {
        break;
      }
    }
    for (int i = 1; i <= k; i++) {
      if (cur.second + i >= w || grid[cur.first][cur.second + i] == '@') {
        break;
      }
      if (dist[cur.first][cur.second + i] == -1) {
        dist[cur.first][cur.second + i] = dist[cur.first][cur.second] + 1;
        q.push({cur.first, cur.second + i});
      } else if (dist[cur.first][cur.second + i] <=
                 dist[cur.first][cur.second]) {
        break;
      }
    }
  }
  printf("%d\\n", dist[x[1]][y[1]]);
}
int main() {
#ifndef ONLINE_JUDGE
  freopen("input.txt", "r", stdin);
  freopen("output.txt", "w", stdout);
#endif
  int t = 1;
  // cin >> t;
  for (int i = 1; i <= t; i++) {
    // cout << "Case #" << i << ": ";
    solve();
  }
  return 0;
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>

using namespace std;
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
// using namespace __gnu_pbds;

// #define ordered_set tree<int, null_type,less<int>,
// rb_tree_tag,tree_order_statistics_node_update>

const int MOD = 1e9 + 7;
// const int MOD  = 998244353;
const int INF = 0x3f3f3f3f;
const double PI = 4 * atan(1);
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<double, double> pdd;
// struct custom_hash {
//     static uint64_t splitmix64(uint64_t x) {
//         // http://xorshift.di.unimi.it/splitmix64.c
//         x += 0x9e3779b97f4a7c15;
//         x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
//         x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
//         return x ^ (x >> 31);
//     }

//     size_t operator()(uint64_t x) const {
//         static const uint64_t FIXED_RANDOM =
//         chrono::steady_clock::now().time_since_epoch().count(); return
//         splitmix64(x + FIXED_RANDOM);
//     }
// };
// ll gcd(ll a, ll b) {
//     if (a == 0) return b;
//     return gcd(b % a, a);
// }
// ll mod(ll x) {
//     x%=MOD;
//     if(x<0)x+=MOD;
//     return x;
// }
// ll power(int base, int power) {
//     ll prod = 1;
//     ll b = base;
//     while(power) {
//         if (power & 1) {
//             prod = mod(prod*b);
//         }
//         b = mod(b*b);
//         power/=2;
//     }
//     return prod;
// }
struct line {
  ll m, c;
  ll eval(int x) { return 1LL * m * x + c; }
  double intersect(line l) { return (double)(c - l.c) / (l.m - m); }
};
// double degToRad(double x) {
//  return x * PI / 180;
// }
// double area(int a, int b, int c, int d, int e, int f) {
//  return abs(0.5*(a*(d-f)+c*(f-b)+e*(b-d)));
// }
// struct str{
//     string s;
//     ll h[100005];
//     ll p[100005];
//     ll base=37;
//     void hsh(){
//         h[0] = s[0]-'a';
//         p[0] = 1;
//         for(int i=1;i<s.length();i++){
//             h[i]=h[i-1]*base+s[i]-'a';
//             p[i]=p[i-1]*base;
//         }
//     }

//     ll getHash(int l,int r){
//         if(l==0) return h[r];
//         return h[r]-h[l-1]*p[r-l+1];
//     }

// };

// line sweep template
// https://cp-algorithms.com/geometry/intersecting_segments.html const ld EPS =
// 1E-12;

// struct pt {
//     ld x, y;
// };

// struct seg {
//     pt p, q;
//     int id;

//     ld get_y(double x) const {
//         if (abs(p.x - q.x) < EPS)
//             return p.y;
//         return p.y + (q.y - p.y) * (x - p.x) / (q.x - p.x);
//     }
// };

// bool intersect1d(ld l1, ld r1, ld l2, ld r2) {
//     if (l1 > r1)
//         swap(l1, r1);
//     if (l2 > r2)
//         swap(l2, r2);
//     return max(l1, l2) <= min(r1, r2) + EPS;
// }

// int vec(const pt& a, const pt& b, const pt& c) {
//     double s = (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);
//     return abs(s) < EPS ? 0 : s > 0 ? +1 : -1;
// }

// bool intersect(const seg& a, const seg& b)
// {
//     return intersect1d(a.p.x, a.q.x, b.p.x, b.q.x) &&
//            intersect1d(a.p.y, a.q.y, b.p.y, b.q.y) &&
//            vec(a.p, a.q, b.p) * vec(a.p, a.q, b.q) <= 0 &&
//            vec(b.p, b.q, a.p) * vec(b.p, b.q, a.q) <= 0;
// }

// bool operator<(const seg& a, const seg& b)
// {
//     ld x = max(min(a.p.x, a.q.x), min(b.p.x, b.q.x));
//     return a.get_y(x) < b.get_y(x) - EPS;
// }

// struct event {
//     ld x;
//     int tp, id;

//     event() {}
//     event(ld x, int tp, int id) : x(x), tp(tp), id(id) {}

//     bool operator<(const event& e) const {
//         if (abs(x - e.x) > EPS)
//             return x < e.x;
//         return tp > e.tp;
//     }
// };

// set<seg> s;
// vector<set<seg>::iterator> where;

// set<seg>::iterator prev(set<seg>::iterator it) {
//     return it == s.begin() ? s.end() : --it;
// }

// set<seg>::iterator next(set<seg>::iterator it) {
//     return ++it;
// }

// pair<int, int> solve(const vector<seg>& a) {
//     int n = (int)a.size();
//     vector<event> e;
//     for (int i = 0; i < n; ++i) {
//         e.push_back(event(min(a[i].p.x, a[i].q.x), +1, i));
//         e.push_back(event(max(a[i].p.x, a[i].q.x), -1, i));
//     }
//     sort(e.begin(), e.end());

//     s.clear();
//     where.resize(a.size());
//     for (size_t i = 0; i < e.size(); ++i) {
//         int id = e[i].id;
//         if (e[i].tp == +1) {
//             set<seg>::iterator nxt = s.lower_bound(a[id]), prv = prev(nxt);
//             if (nxt != s.end() && intersect(*nxt, a[id]))
//                 return make_pair(nxt->id, id);
//             if (prv != s.end() && intersect(*prv, a[id]))
//                 return make_pair(prv->id, id);
//             where[id] = s.insert(nxt, a[id]);
//         } else {
//             set<seg>::iterator nxt = next(where[id]), prv = prev(where[id]);
//             if (nxt != s.end() && prv != s.end() && intersect(*nxt, *prv))
//                 return make_pair(prv->id, nxt->id);
//             s.erase(where[id]);
//         }
//     }

//     return make_pair(-1, -1);
// }
int h, w, k, x[2], y[2];
void solve() {
  scanf("%d %d %d", &h, &w, &k);
  vector<vector<char>> grid(h + 1, vector<char>(w + 1));
  scanf("%d %d %d %d", &x[0], &y[0], &x[1], &y[1]);
  x[0]--, y[0]--, x[1]--, y[1]--;
  for (int i = 0; i < h; i++) {
    scanf("%c", &grid[i][0]);
    for (int j = 0; j < w; j++) {
      scanf("%c", &grid[i][j]);
    }
  }
  queue<pii> q;
  vector<vector<int>> dist(h + 1, vector<int>(w + 1, -1));
  dist[x[0]][y[0]] = 0;
  q.push({x[0], y[0]});
  while (!q.empty()) {
    pii cur = q.front();
    q.pop();
    for (int i = 1; i <= k; i++) {
      if (cur.first - i < 0 || grid[cur.first - i][cur.second] == '@') {
        break;
      }
      if (dist[cur.first - i][cur.second] == -1) {
        dist[cur.first - i][cur.second] = dist[cur.first][cur.second] + 1;
        q.push({cur.first - i, cur.second});
      }
    }
    for (int i = 1; i <= k; i++) {
      if (cur.first + i >= h || grid[cur.first + i][cur.second] == '@') {
        break;
      }
      if (dist[cur.first + i][cur.second] == -1) {
        dist[cur.first + i][cur.second] = dist[cur.first][cur.second] + 1;
        q.push({cur.first + i, cur.second});
      }
    }
    for (int i = 1; i <= k; i++) {
      if (cur.second - i < 0 || grid[cur.first][cur.second - i] == '@') {
        break;
      }
      if (dist[cur.first][cur.second - i] == -1) {
        dist[cur.first][cur.second - i] = dist[cur.first][cur.second] + 1;
        q.push({cur.first, cur.second - i});
      }
    }
    for (int i = 1; i <= k; i++) {
      if (cur.second + i >= w || grid[cur.first][cur.second + i] == '@') {
        break;
      }
      if (dist[cur.first][cur.second + i] == -1) {
        dist[cur.first][cur.second + i] = dist[cur.first][cur.second] + 1;
        q.push({cur.first, cur.second + i});
      }
    }
  }
  printf("%d\\n", dist[x[1]][y[1]]);
}
int main() {
#ifndef ONLINE_JUDGE
  freopen("input.txt", "r", stdin);
  freopen("output.txt", "w", stdout);
#endif
  int t = 1;
  // cin >> t;
  for (int i = 1; i <= t; i++) {
    // cout << "Case #" << i << ": ";
    solve();
  }
  return 0;
}