Submission #1200954

#TimeUsernameProblemLanguageResultExecution timeMemory
1200954apelpisiaMecho (IOI09_mecho)C++20
0 / 100
439 ms131072 KiB
#include <bits/stdc++.h> #define ff first #define ss second using namespace std; const int nx = 805; int n, s, l=0, r=2000, md, ans=-1; string grid[nx]; pair<int, int> bear, home, dir[4] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}}; set<pair<int, int>> bee; bool check(int steps){ vector<vector<bool>> bg(nx, vector<bool>(nx, false)); queue<pair<int, pair<int, int>>> q, bq; for(auto [y, x] : bee) q.push({0, {y, x}}); while(q.front().ff<md){ int mins = q.front().ff; pair<int, int> pos = q.front().ss; q.pop(); for(int i=0; i<4; i++){ if(pos.ff+dir[i].ff>=0 && pos.ff+dir[i].ff<n && pos.ss+dir[i].ss>=0 && pos.ss+dir[i].ss<n){ if(pos.ff+dir[i].ff==bear.ff && pos.ss+dir[i].ss==bear.ss) return false; else if(!bg[pos.ff+dir[i].ff][pos.ss+dir[i].ss]){ q.push({mins+1, {pos.ff+dir[i].ff, pos.ss+dir[i].ss}}); bg[pos.ff+dir[i].ff][pos.ss+dir[i].ss] = true; } } } } bq.push({0, {bear.ff, bear.ss}}); int bcnt=md+1, brcnt=steps; while(!bq.empty()){ while(bq.front().ff<brcnt){ int mins = bq.front().ff; pair<int, int> pos = bq.front().ss; bq.pop(); if(bg[pos.ff][pos.ss]) continue; for(int i=0; i<4; i++){ if(pos.ff+dir[i].ff>=0 && pos.ff+dir[i].ff<n && pos.ss+dir[i].ss>=0 && pos.ss+dir[i].ss<n){ if(pos.ff+dir[i].ff==home.ff && pos.ss+dir[i].ss==home.ss) return true; else if(!bg[pos.ff+dir[i].ff][pos.ss+dir[i].ss]){ bq.push({mins+1, {pos.ff+dir[i].ff, pos.ss+dir[i].ss}}); } } } } brcnt+=steps; while(q.front().ff<bcnt){ int mins = q.front().ff; pair<int, int> pos = q.front().ss; q.pop(); for(int i=0; i<4; i++){ if(pos.ff+dir[i].ff>=0 && pos.ff+dir[i].ff<n && pos.ss+dir[i].ss>=0 && pos.ss+dir[i].ss<n){ if(pos.ff+dir[i].ff==bear.ff && pos.ss+dir[i].ss==bear.ss) return false; else if(!bg[pos.ff+dir[i].ff][pos.ss+dir[i].ss]){ q.push({mins+1, {pos.ff+dir[i].ff, pos.ss+dir[i].ss}}); bg[pos.ff+dir[i].ff][pos.ss+dir[i].ss] = true; } } } } } return false; } int main(){ cin.tie(NULL)->sync_with_stdio(false); cin >> n >> s; for(int i=0; i<n; i++){ cin >> grid[i]; for(int j=0; j<n; j++){ if(grid[i][j]=='H') bee.insert({i, j}); else if(grid[i][j]=='M') bear = {i, j}; else if(grid[i][j]=='D') home = {i, j}; } } while(l<=r){ md = l+(r-l)/2; if(check(s)){ ans = md; l = md+1; } else r = md-1; } cout << ans-1; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...