Submission #1161627

#TimeUsernameProblemLanguageResultExecution timeMemory
1161627misavoMecho (IOI09_mecho)C++20
100 / 100
116 ms22248 KiB
#include <bits/stdc++.h>
// #include <iostream>

#pragma GCC optimize("O3")
#pragma GCC target("avx2")
#define sz(x) int((x).size())
#define all(a) begin(a), end(a)
#define pll pair<long long, long long>
#define vb vector<bool>
#define vll vector<long long>
#define vvll vector<vector<long long> >
#define vpl vector< pair<long long, long long> >
#define f(i,s,e) for(long long int i = s; i < e; i++)
#define cf(i,s,e) for(long long int i = s; i <= e; i++)
#define rf(i,s,e) for(long long int i = s; i >= e; i--)
#define print(a) for(auto x : a) cout << x << " " <<endl;
#define printp(a) for(auto x : a) cout << x.first << " " << x.second <<endl;
#define pb push_back
#define F first
#define S second
using namespace std;
typedef long long ll;
typedef long double ld;

inline ll read() {ll x = 0, fh = 1; char ch = getchar(); while(!isdigit(ch)) {if (ch == '-') fh = -1; ch = getchar();} while (isdigit(ch)) {x = (x << 1) + (x << 3) + ch - '0'; ch = getchar();} return x*fh;}

const ll INF = 1e9;
const ll MOD = 1e9 + 7;

ll t, n, m, s, k, a, b, tot;
char mat[1000][1000];
bool visited[1000][1000];

void solve() {
    cin >> n >> s;
    f(i, 0, n) f(j, 0, n) cin >> mat[i][j];

    vector<vpl> bees;
    queue<pll> q;
    f(i, 0, n) {
        f(j, 0, n) {
            if (mat[i][j] == 'H') {
                visited[i][j] = 1;
                q.push({i, j});
            }
        }
    }

    vpl vec;
    ll cnt = q.size();
    while (!q.empty()) {
        pll curr = q.front();
        vec.pb(curr);
        q.pop();

        ll x = curr.F, y = curr.S;
        if (x > 0 && !visited[x-1][y]) {
            if (mat[x-1][y] == 'G' || mat[x-1][y] == 'M') q.push({x-1, y});
            visited[x-1][y] = 1;
        }
        if (x < n-1 && !visited[x+1][y]) {
            if (mat[x+1][y] == 'G' || mat[x+1][y] == 'M') q.push({x+1, y});
            visited[x+1][y] = 1;
        }
        if (y > 0 && !visited[x][y-1]) {
            if (mat[x][y-1] == 'G' || mat[x][y-1] == 'M') q.push({x, y-1});
            visited[x][y-1] = 1;
        }
        if (y < n-1 && !visited[x][y+1]) {
            if (mat[x][y+1] == 'G' || mat[x][y+1] == 'M') q.push({x, y+1});
            visited[x][y+1] = 1;
        }
        
        cnt--;
        if (cnt == 0) {
            bees.pb(vec);
            vec.clear();
            cnt = q.size();
        }
    }

    pll start;
    f(i, 0, n) f(j, 0, n) if (mat[i][j] == 'M') {start = {i, j}; break;}

    ll l = 0, r = bees.size() - 1;
    tot = -1;
    while (l <= r) {
        ll m = (l + r) / 2;

        vector<vb> visited(n, vb(n, 0));
        vector<vb> infect(n, vb(n, 0));
        cf(i, 0, m) for (pll bee : bees[i]) infect[bee.F][bee.S] = 1;

        queue<pll> q;
        q.push(start);
        visited[start.F][start.S] = 1;
        bool reach = false;
        ll mv = 0, cnt = 1;
        while (!q.empty()) {
            pll curr = q.front();
            q.pop();

            ll x = curr.F, y = curr.S;
            if (!infect[x][y]) {
                if (x > 0 && !visited[x-1][y]) {
                    if (mat[x-1][y] == 'D') {
                        reach = true;
                        break;
                    } else if (mat[x-1][y] == 'G') q.push({x-1, y});
                    visited[x-1][y] = 1;
                }
                if (x < n-1 && !visited[x+1][y]) {
                    if (mat[x+1][y] == 'D') {
                        reach = true;
                        break;
                    } else if (mat[x+1][y] == 'G') q.push({x+1, y});
                    visited[x+1][y] = 1;
                }
                if (y > 0 && !visited[x][y-1]) {
                    if (mat[x][y-1] == 'D') {
                        reach = true;
                        break;
                    } else if (mat[x][y-1] == 'G') q.push({x, y-1});
                    visited[x][y-1] = 1;
                }
                if (y < n-1 && !visited[x][y+1]) {
                    if (mat[x][y+1] == 'D') {
                        reach = true;
                        break;
                    } else if (mat[x][y+1] == 'G') q.push({x, y+1});
                    visited[x][y+1] = 1;
                }
            }

            cnt--;
            if (cnt == 0) {
                mv++;
                cnt = q.size();
                if (mv % s == 0) {
                    for (pll bee : bees[m + mv/s]) infect[bee.F][bee.S] = 1;
                }
            } 
        }

        if (reach) {
            l = m + 1;
            tot = m;
        } else r = m - 1;
    } cout << tot <<endl;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    t = 1;
    while (t--) {
        solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...