Submission #1201138

#TimeUsernameProblemLanguageResultExecution timeMemory
1201138abckefjiMecho (IOI09_mecho)C++20
100 / 100
145 ms6948 KiB
#include<bits/stdc++.h>

using namespace std;
 
#define ll long long
#define pi pair<int, int>
#define ti tuple<ll, int, int>
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define int ll

vector<vector<char>> grid;
vector<vector<ll>> t;

vector<pi> direction={{1, 0}, {0, 1}, {-1, 0}, {0, -1}};

int n;
ll s;
int si=-1, sj=-1;

bool bfs(ll mid) {
    vector<vector<bool>> visited(n, vector<bool>(n));
    queue<ti> nq;
    
    if(mid<t[si][sj]) nq.push({s*mid, si, sj});
    else return false;
    visited[si][sj]=true;
    
    while(nq.size()) {
        auto [cnt, i, j]=nq.front(); nq.pop();

        if(grid[i][j]=='D') return true;
        
        for(auto &[di, dj]: direction) {
            int ni=i+di;
            int nj=j+dj;
            
            if(ni>=0 && nj>=0 && ni<n && nj<n && (t[ni][nj]==LLONG_MAX || (ll)(cnt+1)<1LL*s*t[ni][nj]) && grid[ni][nj]!='T' && !visited[ni][nj]) {
                visited[ni][nj]=true;
                nq.push({cnt+1, ni, nj});
            }
        }
    }
    
    return false;
}


int32_t main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    
    cin >> n >> s;
    
    grid.resize(n, vector<char>(n));
    t.resize(n, vector<ll>(n, LLONG_MAX));
    
    queue<ti> q;
    
    for(int i=0; i<n; i++) {
        for(int j=0; j<n; j++) {
            cin >> grid[i][j];
            
            if(grid[i][j]=='H') {
                q.push({0, i, j});
                t[i][j]=0;
//                visited[i][j]
            } else if(grid[i][j]=='M') {
                si=i;
                sj=j;
            }
        }
    }

    
    while(q.size()) {
        auto [cnt, i, j]=q.front(); q.pop();
        
        for(auto &[di, dj]: direction) {
            int ni=i+di;
            int nj=j+dj;
            
            
            if(ni>=0 && nj>=0 && ni<n && nj<n && t[ni][nj]==LLONG_MAX && (grid[ni][nj]!='T' && grid[ni][nj]!='D')) {
                t[ni][nj]=cnt+1;
                q.push({cnt+1, ni, nj});
            }
        }
    }
    
//    for (int i = 0; i < n; i++) {
//        for (int j = 0; j < n; j++) cout << (t[i][j] == LLONG_MAX ? -1 : t[i][j]) << ' ';
//        cout << '\n';
//    }
    
    ll l=-1, r=1e9;
    
    while(l<r) {
        ll mid=(l+r+1)/2;
        
        if(bfs(mid)) {
            l=mid;
        } else {
            r=mid-1;
        }
    }
    
    cout << (l<INT_MAX ? l:-1);
    
    return 0;
}

#Verdict Execution timeMemoryGrader output
Fetching results...