# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
501337 | sidon | Mecho (IOI09_mecho) | C++17 | 281 ms | 6168 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
#define c(X, Y) (X * N + Y)
const int INF = 1e8;
const int di[4] = {-1, 1, 0, 0};
const int dj[4] = {0, 0, -1, 1};
int N, S, h[1<<20], m[1<<20], o[1<<20], ans = -1, home;
string g[1<<10];
void BFS(char src, int *d, function<int(int, int, int)> valid) {
fill(d, d + N * N, INF);
queue<int> q;
for(int i = 0; i < N; i++)
for(int j = 0; j < N; j++)
if(g[i][j] == src)
d[c(i, j)] = 0, q.push(c(i, j));
else if(g[i][j] == 'D')
home = c(i, j);
while(!empty(q)) {
int k = q.front(), i = k / N, j = k % N; q.pop();
for(int s = 0; s < 4; s++) {
int x = i + di[s], y = j + dj[s], z = c(x, y);
if(min(x, y) < 0 || max(x, y) >= N || d[z] != INF) continue;
if(valid(x, y, d[k] + 1))
d[z] = d[k] + 1, q.push(z);
}
}
}
signed main(){
ios_base::sync_with_stdio(0); cin.tie(0);
cin >> N >> S;
for(int i = 0; i < N; i++)
cin >> g[i];
BFS('H', h, [&](int i, int j, int k) {
return g[i][j] & 1;
});
BFS('D', m, [&](int i, int j, int k) {
return g[i][j] & 1;
});
for(int b = 30; --b >= 0; ) {
ans += 1 << b;
BFS('M', m, [&](int i, int j, int k) {
return (g[i][j] & 1 || g[i][j] == 'D') && k / S + ans < h[c(i, j)];
});
if(m[home] == INF)
ans -= 1 << b;
}
cout << ans;
}
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |