Submission #1275083

#TimeUsernameProblemLanguageResultExecution timeMemory
1275083lmduc270410Mecho (IOI09_mecho)C++20
20 / 100
1097 ms26840 KiB
#include<bits/stdc++.h> using namespace std; #define ll long long #define fi first #define se second #define ldb long double #define pii pair<int, int> #define bend(v) v.begin(), v.end() const int N = 800 + 5, M = 1e6 + 5; const int mod = 1e9 + 7; const int base = 311; const int inf = INT_MAX; const ll INF = LLONG_MAX; const int dx[4] = {0, 0, -1, 1}; const int dy[4] = {-1, 1, 0, 0}; int n, k; string a[N], b[N]; queue<pair<pii, int>> qu; void ms_bfs(int t){ while(!qu.empty()) qu.pop(); for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ if(b[i][j] == 'H') qu.push({{i, j}, t}); } } while(!qu.empty()){ pii ord = qu.front().fi; int x = ord.fi, y = ord.se, remain = qu.front().se; qu.pop(); if(!remain) continue; for(int dir = 0; dir < 4; dir++){ int u = x + dx[dir], v = y + dy[dir]; if(u < 0 || u >= n || v < 0 || v >= n || b[u][v] != 'G') continue; b[u][v] = 'H'; qu.push({{u, v}, remain - 1}); } } } vector<pii> mechoo(vector<pii> cur){ vector<pii> tmp; while(!qu.empty()) qu.pop(); for(pii ord : cur){ int x = ord.fi, y = ord.se; if(b[x][y] == 'H') continue; qu.push({{x, y}, k}); } while(!qu.empty()){ pii ord = qu.front().fi; int x = ord.fi, y = ord.se, remain = qu.front().se; qu.pop(); tmp.push_back({x, y}); if(!remain){ continue; } for(int dir = 0; dir < 4; dir++){ int u = x + dx[dir], v = y + dy[dir]; if(u < 0 || u >= n || v < 0 || v >= n) continue; if(b[u][v] != 'G' && b[u][v] != 'D') continue; b[u][v] = 'M'; qu.push({{u, v}, remain - 1}); } } return tmp; } bool bfs(){ vector<pii> be1, be2; //bees vector<pii> me; //mecho pii en = {-1, -1}; for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ if(b[i][j] == 'M') me.push_back({i, j}); if(b[i][j] == 'H') be1.push_back({i, j}); if(b[i][j] == 'D') en = {i, j}; } } // cout<<"\nMECHOOOO\n"; // for(pii ord : me) cout<<ord.fi<<" "<<ord.se<<'\n'; // cout<<"BEEEEEEEEEEEEEEEES\n"; // for(pii ord : be1) cout<<ord.fi<<" "<<ord.se<<'\n'; // cout<<"HOME "<<en.fi<<" "<<en.se<<'\n'; // return; while(!me.empty()){ me = mechoo(me); if(b[en.fi][en.se] == 'M') return 1; be2.clear(); for(pii ord : be1){ int x = ord.fi, y = ord.se; for(int dir = 0; dir < 4; dir++){ int u = x + dx[dir], v = y + dy[dir]; if(u < 0 || u >= n || v < 0 || v >= n) continue; if(b[u][v] != 'M' && b[u][v] != 'G') continue; b[u][v] = 'H'; be2.push_back({u, v}); } } be1.clear(); swap(be1, be2); // cout<<"----------------------\n"; // for(int i = 0; i < n; i++) cout<<b[i]<<'\n'; } return 0; } bool check(int t){ for(int i = 0; i < n; i++) b[i] = a[i]; ms_bfs(t); // for(int i = 0; i < n; i++) cout<<b[i]<<'\n'; return bfs(); } void solve(){ cin>>n>>k; for(int i = 0; i < n; i++) cin>>a[i]; // cout<<check(1); return; int l = 0, r = 2 * n, mid; while(l <= r){ mid = (l + r) >> 1; if(check(mid)) l = mid + 1; else r = mid - 1; } cout<<r; } signed main(){ // freopen(".inp", "r", stdin); // freopen(".out", "w", stdout); ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int tc = 1; // cin>>tc; while(tc--) solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...