Submission #1200475

#TimeUsernameProblemLanguageResultExecution timeMemory
1200475SonicMLMecho (IOI09_mecho)C++20
26 / 100
731 ms131072 KiB
#include <iostream> #include <queue> using namespace std; typedef short sh; int const INF = 1e9+7; int dirX[4] = {-1, 0, 1, 0}; int dirY[4] = {0, 1, 0, -1}; int const NMAX = 800; char mat[1 + NMAX][1 + NMAX]; int bee[1 + NMAX][1 + NMAX]; bool isValid(pair <sh, sh> to, int n) { return (1 <= to.first && to.first <= n && 1 <= to.second && to.second <= n && (mat[to.first][to.second] == 'G' || mat[to.first][to.second] == 'M' || mat[to.first][to.second] == 'D')); } void beeBFS(int n, int step) { queue <pair <sh, sh>> q; for(int i = 1;i <= n;i++) { for(int j = 1;j <= n;j++) { bee[i][j] = INF; if(mat[i][j] == 'H') { bee[i][j] = 0; q.push({i, j}); } } } while(!q.empty()) { pair <sh, sh> from = q.front(); q.pop(); for(int dir = 0;dir < 4;dir++) { pair <sh, sh> to = {from.first + dirX[dir], from.second + dirY[dir]}; if(isValid(to, n)) { if(bee[from.first][from.second] + step < bee[to.first][to.second]) { bee[to.first][to.second] = bee[from.first][from.second] + step; q.push(to); } } } } } int bear[1 + NMAX][1 + NMAX]; bool bearBFS(int n, int start) { queue <pair <sh, sh>> q; pair <sh, sh> fin; for(int i = 1;i <= n;i++) { for(int j = 1;j <= n;j++) { bear[i][j] = INF; if(mat[i][j] == 'M') { bear[i][j] = start; q.push({i, j}); } if(mat[i][j] == 'D') { fin = {i, j}; } } } while(!q.empty()) { pair <sh, sh> from = q.front(); q.pop(); if(bear[from.first][from.second] < bee[from.first][from.second]) { for(int dir = 0;dir < 4;dir++) { pair <sh, sh> to = {from.first + dirX[dir], from.second + dirY[dir]}; if(isValid(to, n) && bear[from.first][from.second] + 1 <= bear[to.first][to.second]) { bear[to.first][to.second] = bear[from.first][from.second] + 1; q.push(to); } } } } if(bear[fin.first][fin.second] <= bee[fin.first][fin.second]) { return true; } return false; } int cautbin(int from, int to, int n) { if(from >= to) { return from; } else { int mid = (from + to + 1) / 2; if(bearBFS(n, mid)) { return cautbin(mid, to, n); } else { return cautbin(from, mid-1, n); } } } void printBee(int n) { for(int i = 1;i <= n;i++) { for(int j = 1;j <= n;j++) { cerr << bee[i][j] << ' '; } cerr << '\n'; } cerr << '\n'; } int main() { int n, step; cin >> n >> step; for(int i = 1;i <= n;i++) { for(int j = 1;j <= n;j++) { cin >> mat[i][j]; } } beeBFS(n, step); cout << cautbin(0, n*n*step, n) / step; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...