Submission #558333

#TimeUsernameProblemLanguageResultExecution timeMemory
558333CookieMecho (IOI09_mecho)C++14
100 / 100
182 ms7388 KiB
#include <bits/stdc++.h> using namespace std; #define LIFESUCKS ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0) #define ll long long #define ld long double #define ar array #include<cstdio> #define vt vector #include<fstream> ifstream fin("piggyback.in"); ofstream fout("piggyback.out"); #include<fstream> #define pb push_back #define all(c) (c).begin(), (c).end() #define fi first #define se second #define vt vector using namespace std; int n, s, sti, stj, eni, enj; bool vis[801][801]; int dis[801][801]; int dis2[801][801]; char a[801][801]; bool bee = true; const int x[4] = {1, -1, 0, 0}; const int y[4] = {0, 0, 1, -1}; bool check(int mid){ memset(vis, false, sizeof(vis)); memset(dis2, false, sizeof(dis2)); queue<pair<int, int>>q; q.push({sti, stj}); vis[sti][stj] = true; if(mid >= dis[sti][stj])return(false); dis2[sti][stj] = 0; while(!q.empty()){ auto now = q.front(); q.pop(); //cout << "mm"; for(int i = 0; i < 4; i++){ int cri = now.fi + x[i]; int crj = now.se + y[i]; if(cri < 0 || crj < 0 || cri >= n || crj >= n)continue; if(!vis[cri][crj] &&(a[cri][crj] == 'G' || a[cri][crj] == 'D' || a[cri][crj] == 'M')){ // cout << "lol"; if(dis[cri][crj] > floor((double)(dis2[now.fi][now.se] + 1) / (double)s) + mid){ vis[cri][crj] = true; dis2[cri][crj] = dis2[now.fi][now.se] + 1; if(a[cri][crj] == 'D')return(true); q.push({cri, crj}); } } } } //cout << "\n"; return(false); } void bfs(){ memset(vis, false, sizeof(vis)); queue<pair<int, int>>q; for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ if(a[i][j] == 'H'){ q.push({i, j}); vis[i][j] = true; dis[i][j] = 0; } } } while(!q.empty()){ auto now = q.front(); q.pop(); for(int i = 0; i < 4; i++){ int cri = now.fi + x[i]; int crj = now.se + y[i]; if(cri < 0 || crj < 0 || cri >= n || crj >= n)continue; if(!vis[cri][crj] && (a[cri][crj] == 'G' || a[cri][crj] == 'H' || a[cri][crj] == 'M')){ vis[cri][crj] = true; dis[cri][crj] = dis[now.fi][now.se] + 1; q.push({cri, crj}); } } } } int main(){ LIFESUCKS; cin >> n >> s; for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ dis[i][j] = 1e9; cin >> a[i][j]; if(a[i][j] == 'M'){ sti = i, stj = j; }if(a[i][j] == 'D'){ eni = i; enj = j; } } } //cout << sti << ' ' << stj << " "; bfs(); int l = 0; int r = 1e9; int ans = -1; while(l <= r){ int mid = l + (r - l) / 2; if(check(mid)){ ans = mid; l = mid + 1; }else{ r = mid - 1; } } cout << ans; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...