Submission #952038

#TimeUsernameProblemLanguageResultExecution timeMemory
952038Yell0Mecho (IOI09_mecho)C++17
100 / 100
117 ms9308 KiB
#include <bits/stdc++.h> using namespace std; typedef pair<int,int> pii; const int MN=802; int N, S, bee[MN][MN], best[MN][MN], dist[MN][MN]; char gr[MN][MN]; pii start, dest; bool chk(int r, int c) { return 0 <= r && r < N && 0 <= c && c < N && gr[r][c] != 'T' && gr[r][c] != 'H'; } bool bschk(int wait) { queue<pii> q; q.emplace(start); dist[start.first][start.second] = 0; if(wait > bee[start.first][start.second]) return 0; while(!q.empty()) { int r = q.front().first, c = q.front().second; q.pop(); int d = dist[r][c] + 1; if(chk(r+1,c) && dist[r+1][c] == -1 && bee[r+1][c] - d/S - wait > -1) { dist[r+1][c] = d; q.emplace(r+1, c); } if(chk(r-1,c) && dist[r-1][c] == -1 && bee[r-1][c] - d/S - wait > -1) { dist[r-1][c] = d; q.emplace(r-1, c); } if(chk(r,c+1) && dist[r][c+1] == -1 && bee[r][c+1] - d/S - wait > -1) { dist[r][c+1] = d; q.emplace(r, c+1); } if(chk(r,c-1) && dist[r][c-1] == -1 && bee[r][c-1] - d/S - wait > -1) { dist[r][c-1] = d; q.emplace(r, c-1); } } return dist[dest.first][dest.second] > -1; } int main() { ios::sync_with_stdio(0); cin.tie(0); cin>>N>>S; queue<pii> beeq; for(int i=0; i<N; ++i) { cin>>gr[i]; for(int j=0; j<N; ++j) { if(gr[i][j] == 'H') beeq.emplace(i,j); if(gr[i][j] == 'M') start = pii(i,j); if(gr[i][j] == 'D') dest = pii(i,j); } } memset(bee, -1, sizeof(bee)); while(!beeq.empty()) { int r = beeq.front().first, c = beeq.front().second; beeq.pop(); int dist = bee[r][c]; if(chk(r+1,c) && bee[r+1][c] == -1 && gr[r+1][c] != 'D') { bee[r+1][c] = dist+1; beeq.emplace(r+1, c); } if(chk(r-1,c) && bee[r-1][c] == -1 && gr[r-1][c] != 'D') { bee[r-1][c] = dist+1; beeq.emplace(r-1, c); } if(chk(r,c+1) && bee[r][c+1] == -1 && gr[r][c+1] != 'D') { bee[r][c+1] = dist+1; beeq.emplace(r, c+1); } if(chk(r,c-1) && bee[r][c-1] == -1 && gr[r][c-1] != 'D') { bee[r][c-1] = dist+1; beeq.emplace(r, c-1); } } bee[dest.first][dest.second] = 1e9; int lo = 0, hi = N*N, ans = -1; while(lo <= hi) { int mid = (lo+hi)/2; memset(dist, -1, sizeof(dist)); if(bschk(mid)) { ans = mid; lo = mid+1; } else hi = mid-1; } cout<<ans<<'\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...