제출 #1101365

#제출 시각아이디문제언어결과실행 시간메모리
1101365jadai007Mecho (IOI09_mecho)C++17
28 / 100
470 ms18528 KiB
#include<bits/stdc++.h> #define int long long using namespace std; int n, s, disH[1010][1010], dis[1010][1010], xx[] = {0, 0, -1, 1}, xy[] = {-1, 1, 0, 0}; char mp[1010][1010]; queue<tuple<int, int, int>> q; bool solve(int mid){ for(int i = 1; i <= n; ++i){ for(int j = 1; j <= n; ++j){ if(mp[i][j] == 'M') q.emplace(i, j, mid*s), dis[i][j] = mid*s; else dis[i][j] = 1e18; } } while(!q.empty()){ int x = get<0>(q.front()), y = get<1>(q.front()), w = get<2>(q.front()); q.pop(); if(dis[x][y] < w || dis[x][y] >= disH[x][y]) continue; if(mp[x][y] == 'D') return true; for(int i = 0; i < 4; ++i){ int nx = x + xx[i]; int ny = y + xy[i]; if(nx < 1 || nx > n || ny < 1 || ny > n || mp[nx][ny] == 'T') continue; if(dis[nx][ny] > w + 1){ dis[nx][ny] = w + 1; q.emplace(nx, ny, w + 1); } } } return false; } int32_t main(){ cin.tie(nullptr)->sync_with_stdio(false); cin >> n >> s; for(int i = 1; i<=n; ++i) for(int j = 1; j <= n; ++j) cin >> mp[i][j]; for(int i = 1; i <= n; ++i){ for(int j = 1; j <=n; ++j){ if(mp[i][j] == 'H') q.emplace(i, j, 0), disH[i][j] = 0; else disH[i][j] = 1e18; } } while(!q.empty()){ int x = get<0>(q.front()), y = get<1>(q.front()), w = get<2>(q.front()); q.pop(); if(disH[x][y] < w) continue; for(int i = 0; i < 4; ++i){ int nx = x + xx[i]; int ny = y + xy[i]; if(nx < 1 || nx > n || ny < 1 || ny > n || mp[nx][ny] == 'T') continue; if(disH[nx][ny] > w + 1){ disH[nx][ny] = w + 1; q.emplace(nx, ny, w + 1); } } } for(int i = 1; i <= n; ++i) for(int j = 1; j <= n; ++j) disH[i][j] == 1e18 ? disH[i][j] *= 1 : disH[i][j] *= s; int l = 0, r = 1e18, ans = -1; //for(int i = 1; i <= n; ++i) for(int j = 1; j <= n; ++j) cout << i << ' ' << j << ' ' << disH[i][j] << '\n'; while(l <= r){ int mid = (l + r) >> 1; if(solve(mid)) ans = mid, l = mid + 1; else r = mid - 1; } cout << ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...