Submission #1196208

#TimeUsernameProblemLanguageResultExecution timeMemory
1196208rcllMecho (IOI09_mecho)C++20
100 / 100
484 ms6828 KiB
#include <bits/stdc++.h> using namespace std; const int MAX_N=800; vector<string> field(MAX_N); int n,s; bool valid_sq(int x,int y) { return x >= 0 && x<n && y >= 0 && y<n && (field[x][y]=='G' || field[x][y]=='M'); } bool mecho_reached(int mecho_dis,int bees_dis) { return mecho_dis/s<bees_dis; } int main() { cin >> n >> s; for (int i=0; i<n; i++) { cin >> field[i]; } vector<pair<int,int>> hives; int mechox,mechoy,home_x,home_y; for (int i=0; i<n; i++) { for (int j=0; j<n; j++) { if (field[i][j]=='M') { mechox=i; mechoy=j; } else if (field[i][j]=='H') { hives.push_back({i,j}); } else if (field[i][j]=='D') { home_x=i; home_y=j; } } } int dx[]={-1,0,1,0}; int dy[]={0,-1,0,1}; int l=0; int r=n * n; while (l <= r) { vector<vector<bool>> bees_visited(n,vector<bool>(n)); vector<vector<bool>> mecho_visited(n,vector<bool>(n)); vector<vector<int>> bees_time(n,vector<int>(n)); vector<vector<int>> mecho_time(n,vector<int>(n)); queue<pair<int,int>> q; int eating_time=(l+r)/2; for (auto i:hives) { q.push({i.first,i.second}); bees_visited[i.first][i.second]=true; } while (!q.empty()) { int x=q.front().first,y=q.front().second; q.pop(); for (int i=0; i<4; i++) { int nx=x+dx[i],ny=y+dy[i]; if (valid_sq(nx,ny) && !bees_visited[nx][ny]) { bees_time[nx][ny]=bees_time[x][y]+1; q.push({nx,ny}); bees_visited[nx][ny]=true; } } } q.push({mechox,mechoy}); mecho_visited[mechox][mechoy]=true; if (bees_time[mechox][mechoy] <= eating_time) { q.pop(); } while (!q.empty()) { int x=q.front().first,y=q.front().second; q.pop(); for (int i=0; i<4; i++) { int nx=x+dx[i],ny=y+dy[i]; if (valid_sq(nx,ny) && !mecho_visited[nx][ny] && mecho_reached(mecho_time[x][y]+1, bees_time[nx][ny]-eating_time)) { mecho_visited[nx][ny]=true; q.push({nx,ny}); mecho_time[nx][ny]=mecho_time[x][y]+1; } } } bool reached=false; for (int i=0; i<4; i++) { int nx=home_x+dx[i],ny=home_y+dy[i]; if (valid_sq(nx,ny) && mecho_reached(mecho_time[nx][ny],bees_time[nx][ny]-eating_time) && mecho_visited[nx][ny]) { reached=true; } } if (reached) { l=eating_time+1; } else { r=eating_time-1; } } cout << l-1 << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...