#include <bits/stdc++.h>
#define FOR(i, x, y) for (int i = x; i < y; i++)
typedef long long ll;
using namespace std;
struct Ball {
int x, y, d;
ll f;
};
bool operator<(Ball A, Ball B) { return A.f > B.f; }
int h, w;
ll vert[501][501], to_p[501][501], dp[501][501][5];
bool visited[501][501][5];
int dx[5]{0, 0, 0, 1, -1}, dy[5]{0, 1, -1, 0, 0};
bool inside(int x, int y) {
return (~x && ~y && x <= h && y <= w);
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int n;
ll a, b, c;
Ball dest;
priority_queue<Ball> pq;
cin >> h >> w >> a >> b >> c >> n;
memset(vert, 0x3f, sizeof(vert));
memset(to_p, 0x3f, sizeof(to_p));
memset(dp, 0x3f, sizeof(dp));
FOR(i, 0, n) {
int x, y;
cin >> x >> y;
vert[x][y] = 0;
if (!i) pq.push({x, y, 0, 0}), visited[x][y][0] = 0;
if (i == n - 1) dest = {x, y, 0, 0};
}
FOR(i, 0, h + 1) FOR(j, 0, w + 1) {
if (i) vert[i][j] = min(vert[i][j], vert[i - 1][j] + 1);
if (i < h) vert[n - i][j] = min(vert[n - i][j], vert[n - i + 1][j] + 1);
}
FOR(i, 0, h + 1) FOR(j, 0, w + 1) FOR(k, 0, w + 1)
to_p[i][j] = min(to_p[i][j], vert[i][k] + abs(j - k));
while (pq.size()) {
Ball curr = pq.top();
pq.pop();
if (!visited[curr.x][curr.y][curr.d]) {
visited[curr.x][curr.y][curr.d] = true;
if (curr.d) { // Ball is at (x, y) and is/was moving in direction d
// Ball continues in the direction
int nx = curr.x + dx[curr.d], ny = curr.y + dy[curr.d];
if (inside(nx, ny) && curr.f + a < dp[nx][ny][curr.d]) {
dp[nx][ny][curr.d] = curr.f + a;
pq.push({nx, ny, curr.d, curr.f + a});
}
// Ball stops and player runs to it
curr.f += to_p[curr.x][curr.y] * c;
}
// Player has ball at (x, y)
FOR(i, 1, 5) {
int nx = curr.x + dx[i], ny = curr.y + dy[i];
if (inside(nx, ny)) {
// Player runs in direction i with the ball
if (curr.f + c < dp[nx][ny][0]) {
dp[nx][ny][0] = curr.f + c;
pq.push({nx, ny, 0, curr.f + c});
}
// Player kicks the ball in direction i
if (curr.f + a + b < dp[nx][ny][i]) {
dp[nx][ny][i] = curr.f + a + b;
pq.push({nx, ny, i, curr.f + a + b});
}
}
}
}
}
ll ans = LLONG_MAX;
FOR(i, 0, 5) ans = min(ans, dp[dest.x][dest.y][i]);
cout << ans;
return 0;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
128 ms |
18156 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
830 ms |
40136 KB |
Output is correct |
2 |
Correct |
869 ms |
64756 KB |
Output is correct |
3 |
Correct |
647 ms |
39752 KB |
Output is correct |
4 |
Incorrect |
738 ms |
40136 KB |
Output isn't correct |
5 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
128 ms |
18156 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |