Submission #1321915

#TimeUsernameProblemLanguageResultExecution timeMemory
1321915xnoelMecho (IOI09_mecho)C++20
100 / 100
146 ms6212 KiB
#include <bits/stdc++.h>
using namespace std;
vector<vector<char>> grid;
vector<vector<int>> dist;
pair<int,int> start,dest;
vector<pair<int,int>> hives;
int n,speed;
int dx[] = {1,0,-1,0};
int dy[] = {0,1,0,-1};

bool bfs(int lag) {
    if (dist[start.first][start.second]!=-1 && dist[start.first][start.second]<=lag) return false;
    vector<vector<int>> walkingdist(n,vector<int>(n,-1));
    queue<pair<int,int>> q;
    q.push(start);  
    walkingdist[start.first][start.second]=0;
    while (!q.empty()) {
        auto [x,y] = q.front();
        q.pop();
        for (int i=0;i<4;i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];
            if (nx<0 || nx>=n || ny<0 || ny>=n) continue;
            if (grid[nx][ny]=='D') {
                return true;
            }
            if (grid[nx][ny]=='T') continue;
            if (walkingdist[nx][ny]==-1) {
                if (dist[nx][ny]>0){
                    if ((walkingdist[x][y]+1)/speed+lag<dist[nx][ny]) {
                        walkingdist[nx][ny]=walkingdist[x][y]+1;
                        q.push({nx,ny});
                    }
                }
                if (dist[nx][ny]==-1 && (grid[nx][ny]=='G' || grid[nx][ny]=='M')) {
                    walkingdist[nx][ny]=walkingdist[x][y]+1;
                    q.push({nx,ny});
                }

            }
        }
    }
    // for (int i=0;i<n;i++) {
    //     for (int j=0;j<n;j++) {
    //         cout<<walkingdist[i][j]<<" ";
    //     }
    // cout<<"\n";
    // }
    // cout<<"\n";
    return false;

}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    //freopen("1.in","r",stdin);
    cin>>n>>speed;
    grid.resize(n,vector<char>(n));
    dist.resize(n,vector<int>(n,-1));

    for (int i=0;i<n;i++) {
        for (int j=0;j<n;j++) {
            cin>>grid[i][j];
            if (grid[i][j]=='H') {
                hives.push_back({i,j});
                dist[i][j]=0;
            }
            else if (grid[i][j]=='T') {
                dist[i][j]=9;
            }
            else if (grid[i][j]=='M') start={i,j};
            else if (grid[i][j]=='D') dest={i,j};
        }
    }

    queue<pair<int,int>> q;
    for (auto [x,y]:hives) q.push({x,y});
    while (!q.empty()) {
        auto [x,y] = q.front();
        q.pop();
        for (int i=0;i<4;i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];
            if (nx<0 || nx>=n || ny<0 || ny>=n) continue;
            if (grid[nx][ny]=='T') continue;
            if (grid[nx][ny]=='D') continue;
            if (dist[nx][ny]==-1) {
                dist[nx][ny]=dist[x][y]+1;
                q.push({nx,ny});
            }
        }
    }

    // for (int i=0;i<n;i++) {
    //     for (int j=0;j<n;j++) {
    //         cout<<dist[i][j]<<" ";
    //     }
    //     cout<<"\n";
    // }
    // cout<<"\n";

    if (!bfs(0)) {
        cout<<-1<<"\n";
        return 0;
    }


    int left=0,right=1000*1000;
    while (left<right) {
        int mid = left+(right-left+1)/2;
        if (bfs(mid)) left=mid;
        else right=mid-1;
    }
    cout<<left<<"\n";

}
#Verdict Execution timeMemoryGrader output
Fetching results...