Submission #941924

#TimeUsernameProblemLanguageResultExecution timeMemory
941924defaultMecho (IOI09_mecho)C++17
100 / 100
136 ms6992 KiB
    #include <bits/stdc++.h>
    using namespace std;
      
    const int dx[4] = {1,0,-1,0}, dy[4] = {0,1,0,-1};
      
    int n,s;
    char str[805][805];
      
    int vis[805][805];
    int dep[805][805];
      
    int sx, sy;
      
    void bee(){
        queue<int> qx, qy, d;
        for (int i=0; i<n; i++) {
            for (int j=0; j<n; j++) {
                if(str[i][j] == 'H'){
                    qx.push(i);
                    qy.push(j);
                    d.push(0);
                    vis[i][j] = 1;
                }
            }
        }
        while (!qx.empty()){
            int xf = qx.front();
            int yf = qy.front();
            int df = d.front();
            qx.pop();
            qy.pop();
            d.pop();
            dep[xf][yf] = df;
            for (int i=0; i<4; i++) {
                int nx = xf + dx[i];
                int ny = yf + dy[i];
                if(nx < 0 || ny < 0 || nx >= n || ny >= n) continue;
                if(vis[nx][ny]) continue;
                if(str[nx][ny] != 'G' && str[nx][ny] != 'M') continue;
                vis[nx][ny] = 1;
                qx.push(nx);
                qy.push(ny);
                d.push(df+1);
            }
        }
    }
      
    bool trial(int x){
        memset(vis,0,sizeof(vis));
        queue<int> qx, qy, d;
        qx.push(sx);
        qy.push(sy);
        d.push(x * s);
        vis[sx][sy] = 1;
        while (!qx.empty()) {
            int xf = qx.front();
            int yf = qy.front();
            int df = d.front();
            qx.pop();
            qy.pop();
            d.pop();
            if(str[xf][yf] == 'D') return 1;
            for (int i=0; i<4; i++) {
                int nx = xf + dx[i];
                int ny = yf + dy[i];
                if(nx < 0 || ny < 0 || nx >= n || ny >= n) continue;
                if(vis[nx][ny]) continue;
                if(str[nx][ny] != 'G' && str[nx][ny] !='D') continue;
                if(str[nx][ny] != 'D' && (df+1) / s >= dep[nx][ny]) continue;
                vis[nx][ny] = 1;
                qx.push(nx);
                qy.push(ny);
                d.push(df+1);
            }
        }
        return 0;
    }
      
    int main(){
        cin >> n >> s ;
        for (int i=0; i<n; i++) {
            cin >> str[i];
            for (int j=0; j<n; j++) {
                if(str[i][j] == 'M') sx = i, sy = j;
            }
        }
        bee();
        int s = 0, e = dep[sx][sy]-1;
        while (s != e) {
            int m = (s+e+1)/2;
            if(trial(m)) s = m;
            else e = m-1;
        }
        if(trial(s)) cout << s << "\n";
        else cout << "-1\n";
    }
#Verdict Execution timeMemoryGrader output
Fetching results...