Submission #1185267

#TimeUsernameProblemLanguageResultExecution timeMemory
1185267prism7kMecho (IOI09_mecho)C++20
13 / 100
142 ms6616 KiB
#include <bits/stdc++.h>
using namespace std;
 
char grid[800][800];
int bee_dist[800][800];
int bear_dist[800][800];
bool vis_dfs[800][800];
const int INF = 2000000005;
 
vector<pair<int,int>> dirs = {{0,1},{1,0},{0,-1},{-1,0}};
 
int main(){
    pair<int,int> bear_start;
    pair<int,int> end;
    int n,s; cin >> n >> s;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            bee_dist[i][j] = bear_dist[i][j] = INF;
        }
    }
    queue<pair<int,int>> q1, q2;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            cin >> grid[i][j];
            if(grid[i][j]=='M'){
                q1.push({i,j});
                bear_dist[i][j] = 0;
                bear_start = {i,j};
            } else if(grid[i][j]=='H'){
                q2.push({i,j});
                bee_dist[i][j] = 0;
            } else if(grid[i][j]=='D'){
                end = {i,j};
            }
        }
    }
    auto valid = [&](int y,int x) -> bool {
        return (y>=0 && y<n && x>=0 && x<n && grid[y][x]!='T');
    };
    while(!q1.empty()){
        int cy = q1.front().first, cx = q1.front().second;
        q1.pop();
        for(auto d: dirs){
            int ny = cy+d.first, nx = cx+d.second;
            if(!valid(ny,nx) || bear_dist[ny][nx]!=INF) continue;
            bear_dist[ny][nx] = bear_dist[cy][cx] + 1;
            q1.push({ny,nx});
        }
    }
    while(!q2.empty()){
        int cy = q2.front().first, cx = q2.front().second;
        q2.pop();
        for(auto d: dirs){
            int ny = cy+d.first, nx = cx+d.second;
            if(!valid(ny,nx) || bee_dist[ny][nx]!=INF || grid[ny][nx]=='D') continue;
            bee_dist[ny][nx] = bee_dist[cy][cx] + 1;
            q2.push({ny,nx});
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(bear_dist[i][j]==INF) continue;
            bear_dist[i][j] = ceil(bear_dist[i][j] / (double)s);
        }
    }
    function<void(int,int,int)> repl = [&](int y,int x,int cr){
        if(cr > s || !valid(y,x)) return;
        if(vis_dfs[y][x]) return;
        vis_dfs[y][x] = true;
        bear_dist[y][x] = 0;
        for(auto d: dirs){
            int ny = y+d.first, nx = x+d.second;
            repl(ny,nx,cr+1);
        }
    };
    repl(end.first,end.second,0);
    auto possible = [&](int w) -> bool {
        int sy = bear_start.first, sx = bear_start.second;
        if(bear_dist[sy][sx] + w >= bee_dist[sy][sx]) return false;
        vector<vector<bool>> vis(n, vector<bool>(n, false));
        queue<pair<int,int>> q;
        q.push({sy,sx});
        vis[sy][sx] = true;
        while(!q.empty()){
            int cy = q.front().first, cx = q.front().second;
            q.pop();
            if(grid[cy][cx]=='D') return true;
            for(auto d: dirs){
                int ny = cy+d.first, nx = cx+d.second;
                if(valid(ny,nx) && !vis[ny][nx] && bear_dist[ny][nx] + w < bee_dist[ny][nx]){
                    vis[ny][nx] = true;
                    q.push({ny,nx});
                }
            }
        }
        return false;
    };
    int lo = 0, hi = 1000000, ans = -1;
    while(lo <= hi){
        int mid = lo + (hi - lo) / 2;
        if(possible(mid)){
            ans = mid;
            lo = mid + 1;
        } else {
            hi = mid - 1;
        }
    }
    cout << ans << "\n";
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...