제출 #484831

#제출 시각아이디문제언어결과실행 시간메모리
484831PoPularPlusPlusMecho (IOI09_mecho)C++17
84 / 100
241 ms7500 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define ull unsigned long long #define pb(e) push_back(e) #define sv(a) sort(a.begin(),a.end()) #define sa(a,n) sort(a,a+n) #define mp(a,b) make_pair(a,b) #define vf first #define vs second #define ar array #define all(x) x.begin(),x.end() const int inf = 0x3f3f3f3f; const int mod = 1000000007; const double PI=3.14159265358979323846264338327950288419716939937510582097494459230; bool remender(ll a , ll b){return a%b;} void clear( std::queue<pair<int,int>> &q ) { std::queue<pair<int,int>> empty; std::swap( q, empty ); } void solve(){ int dx[4] = {0,0,-1,1} , dy[4] = {1,-1,0,0}; int n , s; cin >> n >> s; char arr[n][n]; for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++)cin >> arr[i][j]; } queue<pair<int,int>> q; int dis[n][n]; for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++)dis[i][j] = 1e9; } bool vis[n][n]; memset(vis,0,sizeof vis); pair<int,int> end, start; for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ if(arr[i][j] == 'H'){q.push(mp(i,j));dis[i][j] = 0;vis[i][j] = 1;} if(arr[i][j] == 'D')end = mp(i,j); if(arr[i][j] == 'M')start = mp(i,j); } } while(q.size()){ pair<int,int> node = q.front(); q.pop(); for(int i = 0; i < 4; i++){ if(node.vf + dx[i] >= 0 && node.vf + dx[i] < n && node.vs + dy[i] < n && node.vs + dy[i] >= 0 && !vis[node.vf + dx[i]][node.vs + dy[i]] && arr[node.vf + dx[i]][node.vs + dy[i]] == 'G'){ q.push(mp(node.vf + dx[i] , node.vs + dy[i])); dis[node.vf + dx[i]][node.vs + dy[i]] = dis[node.vf][node.vs] + 1; vis[node.vf + dx[i]][node.vs + dy[i]] = 1; } } } int dis1[n][n]; int l = 0 , r = n * n + 3; int ans = -1; while(l <= r){ int mid = (l + r)/2; memset(dis1,-1,sizeof dis1); dis1[start.vf][start.vs] = s * mid; memset(vis,0,sizeof vis); vis[start.vf][start.vs] = 1; clear(q); q.push(mp(start.vf , start.vs)); while(q.size() && !vis[end.vf][end.vs]){ pair<int,int> node = q.front(); q.pop(); for(int i = 0; i < 4; i++){ if(node.vf + dx[i] >= 0 && node.vf + dx[i] < n && node.vs + dy[i] < n && node.vs + dy[i] >= 0 && !vis[node.vf + dx[i]][node.vs + dy[i]] && (arr[node.vf + dx[i]][node.vs + dy[i]] == 'G' || arr[node.vf + dx[i]][node.vs + dy[i]] == 'D') && dis[node.vf + dx[i]][node.vs + dy[i]] > (dis1[node.vf][node.vs] + 1)/s){ q.push(mp(node.vf + dx[i] , node.vs + dy[i])); dis1[node.vf + dx[i]][node.vs + dy[i]] = dis1[node.vf][node.vs] + 1; vis[node.vf + dx[i]][node.vs + dy[i]] = 1; } } } if(vis[end.vf][end.vs]){ ans = mid; l = mid + 1; } else r = mid - 1; } cout << ans << '\n'; } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); //int t;cin >> t;while(t--) solve(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...