Submission #1295916

#TimeUsernameProblemLanguageResultExecution timeMemory
1295916jigyasu_kalyanMecho (IOI09_mecho)C++20
84 / 100
203 ms11420 KiB
// ============================================================================ // // || || // // || || // //*|| // Jigyasu's Template for cpp // || // // ||--------------------------Expert till July 2025-------------------------|| // // || || // // || || // // ============================================================================ // #include <bits/stdc++.h> using namespace std; #define fast_io cin.sync_with_stdio(false); cin.tie(0); cout.tie(0) // #define cerr if(false)cerr #define int long long #define ll long long #define pb push_back #define eb emplace_back #define all(v) v.begin(), v.end() #define rall(v) v.rbegin(), v.rend() #define sz(x) (int)(x).size() #define MOD 1000000007 #define INF (int)1e16 #define endl "\n" #define sp " " // #define endl endl; cout.flush(); #define input(a, n) vi a(n); for(int i = 0; i < n; i++) cin >> a[i]; #define yes cout << "YES" << endl; return; #define no cout << "NO" << endl; return; #define vi vector<int> #define vvi vector<vector<int> > #define ai(zzz) array<int, zzz> #define pii pair<int, int> // #define f(i, a, b) for (int i = a; i < b; i++) // #define fr(i, a, b) for (int i = a; i > b; i--) //?-------------------------------------------------------------------------------------------------------------------- template <typename T> std::ostream &operator<<(std::ostream &stream, const vector<T> &vec) {for (size_t i = 0; i < vec.size(); i++) { stream << vec[i]; if (i != vec.size() - 1) stream << ' '; }; return stream; } template <typename T> std::istream &operator>>(std::istream &stream, vector<T> &vec) {for (T &x : vec) stream >> x; return stream; } template <typename T> std::istream &operator>>(std::istream &stream, array<T, 2> &arr) {stream >> arr[0] >> arr[1]; return stream; } template <typename T> std::ostream &operator<<(std::ostream &stream, const array<T, 2> &arr) {stream << '(' << arr[0] << ", " << arr[1] << ')'; return stream; } template <typename T, typename U> std::ostream &operator<<(std::ostream &stream, const pair<T, U> &pr) {stream << pr.first << ' ' << pr.second; return stream; } template <typename T, typename U> std::istream &operator>>(std::istream &stream, pair<T, U> &pr) {stream >> pr.first >> pr.second; return stream; } template <typename A, typename B> string to_string(pair<A, B> p); template <typename A, typename B, typename C> string to_string(tuple<A, B, C> p); template <typename A, typename B, typename C, typename D> string to_string(tuple<A, B, C, D> p); string to_string(const string &s) { return '"' + s + '"'; } string to_string(char c) {string s; s += c; return s; } string to_string(const char *s) { return to_string((string)s); } string to_string(bool b) { return (b ? "1" : "0"); } string to_string(vector<bool> v) {bool first = true; string res = "{"; for (int i = 0; i < static_cast<int>(v.size()); i++) {if (!first) {res += ", "; } first = false; res += to_string(v[i]); } res += "}"; return res; } template <size_t N> string to_string(bitset<N> v) {string res = ""; for (size_t i = 0; i < N; i++) {res += static_cast<char>('0' + v[i]); } return res; } template <typename A> string to_string(A v) {bool first = true; string res = "{"; for (const auto &x : v) {if (!first) {res += ", "; } first = false; res += to_string(x); } res += "}"; return res; } template <typename A, typename B> string to_string(pair<A, B> p) { return "(" + to_string(p.first) + ", " + to_string(p.second) + ")"; } template <typename A, typename B, typename C> string to_string(tuple<A, B, C> p) { return "(" + to_string(get<0>(p)) + ", " + to_string(get<1>(p)) + ", " + to_string(get<2>(p)) + ")"; } template <typename A, typename B, typename C, typename D> string to_string(tuple<A, B, C, D> p) { return "(" + to_string(get<0>(p)) + ", " + to_string(get<1>(p)) + ", " + to_string(get<2>(p)) + ", " + to_string(get<3>(p)) + ")"; } void debug_out() { cout << endl; } template <typename Head, typename... Tail> void debug_out(Head H, Tail... T) {cout << " " << to_string(H); debug_out(T...); } //* Debuggers #define debug(x) cout << #x << " = " << x << endl; template<typename T> void print_container(const T& container) { for (auto it = container.begin(); it != container.end(); ++it) { cout << *it; if (next(it) != container.end()) cout << " "; } cout << endl; } #define print(x) print_container(x); //?-------------------------------------------------------------------------------------------------------------------- //* Sieve of Eratosthenes for primes vector<int> sieve(int n) { vi st; // map<int, set<int> >hey_mp; vector<bool> is_prime(n + 1, true); is_prime[0] = is_prime[1] = false; for (int i = 2; i * i <= n; ++i) { if (is_prime[i]) { // hey_mp[i].insert(i); for (int j = i * i; j <= n; j += i) { // if (is_prime[j]) hey_mp[i].push_back(j); is_prime[j] = false; // hey_mp[i].insert(j); } } } // return hey_mp; for (int i = 0; i <= n; i++) { if (is_prime[i]) { st.pb(i); } } return st; } //?-------------------------------------------------------------------------------------------------------------------- //* Modular Multiplication ll mod_mul(ll a, ll b) {return ((a % MOD) * (b % MOD)) % MOD;} //* Binary Exponentiation ll binpow(ll a, ll b, ll m = MOD) { ll res = 1; a %= m; while (b) { if (b & 1ll) res = res * a % m; a = mod_mul(a, a); b >>= 1ll; } return res; } //* Modular Addition ll mod_add(ll a, ll b) {return ((a % MOD) + (b % MOD)) % MOD;} //* Modular Subtraction ll mod_sub(ll a, ll b) {return ((a % MOD) - (b % MOD) + MOD) % MOD;} //* Modular Division (using Modular Inverse) ll mod_inv(ll a, ll m = MOD) {return binpow(a, m - 2, m);} // Fermat's Little Theorem ll mod_div(ll a, ll b) {return mod_mul(a, mod_inv(b));} //?-------------------------------------------------------------------------------------------------------------------- //?-------------------------------------------------------------------------------------------------------------------- int n, s, sx = -1, sy = -1, ex = -1, ey = -1; vector<vector<char>>grid; vector<vector<int>>bee_time; bool is_valid1(int i, int j, int time) { if (i < 0 || i >= n || j < 0 || j >= n || grid[i][j] == 'T' || (time / s) >= bee_time[i][j]) return false; return true; } bool bfs(int time_eaten) { queue<ai(2)>q; vector<vector<int> >dist(n, vector<int>(n, INF)); q.push({sx, sy}); dist[sx][sy] = time_eaten * s; while (!q.empty()) { auto [i, j] = q.front(); q.pop(); int t = dist[i][j] + 1; if (is_valid1(i-1, j, t) && dist[i-1][j] == INF) { q.push({i-1, j}); dist[i-1][j] = t; } if (is_valid1(i+1, j, t) && dist[i+1][j] == INF) { q.push({i+1, j}); dist[i+1][j] = t; } if (is_valid1(i, j-1, t) && dist[i][j-1] == INF) { q.push({i, j-1}); dist[i][j-1] = t; } if (is_valid1(i, j+1, t) && dist[i][j+1] == INF) { q.push({i, j+1}); dist[i][j+1] = t; } } return dist[ex][ey] != INF; } bool is_valid(int i, int j) { if (i < 0 || i >= n || j < 0 || j >= n || grid[i][j] == 'T' || grid[i][j] == 'D' || bee_time[i][j] != INF) return false; return true; } void Solve() { cin >> n >> s; grid.resize(n, vector<char>(n)); bee_time.resize(n, vector<int>(n, INF)); queue<ai(2)>q; for (int i = 0; i < n; i++) { string str; cin >> str; for (int j = 0; j < n; j++) { grid[i][j] = str[j]; if (grid[i][j] == 'M') { sx = i; sy = j; } else if (grid[i][j] == 'D') { ex = i; ey = j; } else if (grid[i][j] == 'H') { bee_time[i][j] = 0; q.push({i, j}); } } } while (!q.empty()) { auto [i, j] = q.front(); q.pop(); if (is_valid(i-1, j)) { bee_time[i-1][j] = bee_time[i][j] + 1; q.push({i-1, j}); } if (is_valid(i+1, j)) { bee_time[i+1][j] = bee_time[i][j] + 1; q.push({i+1, j}); } if (is_valid(i, j-1)) { bee_time[i][j-1] = bee_time[i][j] + 1; q.push({i, j-1}); } if (is_valid(i, j+1)) { bee_time[i][j+1] = bee_time[i][j] + 1; q.push({i, j+1}); } } int l = 0, r = 1e9, ans = -1; while (l <= r) { int mid = (l + r) / 2; if (bfs(mid)) { ans = mid; l = mid + 1; } else r = mid - 1; } cout << ans << endl; } int32_t main() { #ifndef ONLINE_JUDGE auto start = chrono::high_resolution_clock::now(); // Start timer // freopen("atlarge.in", "r", stdin); // freopen("atlarge.out", "w", stdout); #endif fast_io; int tt = 1; // cin >> tt; while (tt--) Solve(); #ifndef ONLINE_JUDGE auto end = chrono::high_resolution_clock::now(); // End timer chrono::duration<double, milli> duration = end - start; cerr << "Time: " << duration.count() << " ms" << endl; #endif }
#Verdict Execution timeMemoryGrader output
Fetching results...