Submission #234006

# Submission time Handle Problem Language Result Execution time Memory
234006 2020-05-22T18:37:05 Z dolphingarlic Soccer (JOI17_soccer) C++14
0 / 100
869 ms 64756 KB
#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;
}
# Verdict Execution time Memory Grader output
1 Incorrect 128 ms 18156 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory 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 -
# Verdict Execution time Memory Grader output
1 Incorrect 128 ms 18156 KB Output isn't correct
2 Halted 0 ms 0 KB -