Submission #234017

# Submission time Handle Problem Language Result Execution time Memory
234017 2020-05-22T20:00:14 Z dolphingarlic Soccer (JOI17_soccer) C++14
100 / 100
621 ms 24032 KB
/*
JOI 2017 Soccer
- First, find the minimum distance to any player for each coordinate
- Notice how the game will look like
    - Run a few steps
    - Kick the ball
    - Another player goes to the ball
    - Repeat
- Then we just do Dijkstra
- Complexity: O(H^3)
*/

#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][6];
bool visited[501][501][6];
int dx[6]{0, 0, 0, 0, 1, -1}, dy[6]{0, 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, 1, 0}), dp[x][y][1] = 0;
        if (i == n - 1) dest = {x, y, 0, 0};
    }

    FOR(i, 1, h + 1) FOR(j, 0, w + 1) {
        vert[i][j] = min(vert[i][j], vert[i - 1][j] + 1);
        vert[h - i][j] = min(vert[h - i][j], vert[h - 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;

            // Ball is at (x, y)
            if (!curr.d) {  // Nearest player runs to ball
                if (curr.f + to_p[curr.x][curr.y] * c < dp[curr.x][curr.y][1]) {
                    dp[curr.x][curr.y][1] = curr.f + to_p[curr.x][curr.y] * c;
                    pq.push({curr.x, curr.y, 1, curr.f + to_p[curr.x][curr.y] * c});
                }
            } else if (curr.d == 1) {  // Player has ball
                FOR(i, 2, 6) {
                    // Player runs in direction i with the ball
                    int nx = curr.x + dx[i], ny = curr.y + dy[i];
                    if (inside(nx, ny) && curr.f + c < dp[nx][ny][1]) {
                        dp[nx][ny][1] = curr.f + c;
                        pq.push({nx, ny, 1, curr.f + c});
                    }
                    // Player kicks the ball in direction i
                    if (curr.f + b < dp[curr.x][curr.y][i]) {
                        dp[curr.x][curr.y][i] = curr.f + b;
                        pq.push({curr.x, curr.y, i, curr.f + b});
                    }
                }
            } else {  // Ball 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
                if (curr.f < dp[curr.x][curr.y][0]) {
                    dp[curr.x][curr.y][0] = curr.f;
                    pq.push({curr.x, curr.y, 0, curr.f});
                }
            }
        }
    }

    ll ans = LLONG_MAX;
    FOR(i, 0, 6) ans = min(ans, dp[dest.x][dest.y][i]);
    cout << ans;
    return 0;
}

Compilation message

soccer.cpp: In function 'int main()':
soccer.cpp:37:10: warning: 'dest.Ball::x' may be used uninitialized in this function [-Wmaybe-uninitialized]
     Ball dest;
          ^~~~
soccer.cpp:37:10: warning: 'dest.Ball::y' may be used uninitialized in this function [-Wmaybe-uninitialized]
# Verdict Execution time Memory Grader output
1 Correct 101 ms 18672 KB Output is correct
2 Correct 13 ms 16128 KB Output is correct
3 Correct 474 ms 23776 KB Output is correct
4 Correct 477 ms 23908 KB Output is correct
5 Correct 100 ms 17144 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 505 ms 23920 KB Output is correct
2 Correct 483 ms 23908 KB Output is correct
3 Correct 377 ms 23524 KB Output is correct
4 Correct 426 ms 23780 KB Output is correct
5 Correct 351 ms 23780 KB Output is correct
6 Correct 441 ms 23780 KB Output is correct
7 Correct 495 ms 23780 KB Output is correct
8 Correct 483 ms 23908 KB Output is correct
9 Correct 492 ms 23776 KB Output is correct
10 Correct 60 ms 19192 KB Output is correct
11 Correct 485 ms 23780 KB Output is correct
12 Correct 486 ms 23784 KB Output is correct
13 Correct 340 ms 23644 KB Output is correct
14 Correct 499 ms 23908 KB Output is correct
15 Correct 368 ms 23792 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 101 ms 18672 KB Output is correct
2 Correct 13 ms 16128 KB Output is correct
3 Correct 474 ms 23776 KB Output is correct
4 Correct 477 ms 23908 KB Output is correct
5 Correct 100 ms 17144 KB Output is correct
6 Correct 505 ms 23920 KB Output is correct
7 Correct 483 ms 23908 KB Output is correct
8 Correct 377 ms 23524 KB Output is correct
9 Correct 426 ms 23780 KB Output is correct
10 Correct 351 ms 23780 KB Output is correct
11 Correct 441 ms 23780 KB Output is correct
12 Correct 495 ms 23780 KB Output is correct
13 Correct 483 ms 23908 KB Output is correct
14 Correct 492 ms 23776 KB Output is correct
15 Correct 60 ms 19192 KB Output is correct
16 Correct 485 ms 23780 KB Output is correct
17 Correct 486 ms 23784 KB Output is correct
18 Correct 340 ms 23644 KB Output is correct
19 Correct 499 ms 23908 KB Output is correct
20 Correct 368 ms 23792 KB Output is correct
21 Correct 116 ms 17396 KB Output is correct
22 Correct 596 ms 23908 KB Output is correct
23 Correct 545 ms 20576 KB Output is correct
24 Correct 608 ms 20844 KB Output is correct
25 Correct 560 ms 23776 KB Output is correct
26 Correct 561 ms 24032 KB Output is correct
27 Correct 402 ms 17720 KB Output is correct
28 Correct 399 ms 17656 KB Output is correct
29 Correct 521 ms 20716 KB Output is correct
30 Correct 377 ms 17656 KB Output is correct
31 Correct 539 ms 23944 KB Output is correct
32 Correct 621 ms 23904 KB Output is correct
33 Correct 479 ms 23776 KB Output is correct
34 Correct 610 ms 23780 KB Output is correct
35 Correct 329 ms 17656 KB Output is correct