답안 #1066270

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1066270 2024-08-19T17:16:25 Z sammyuri Soccer (JOI17_soccer) C++17
35 / 100
3000 ms 16844 KB
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
ll dist[505][505];
ll dist_2[505][505];
ll a, b, c;

ll calc_cost(ll dx, ll dy) {
    ll best = (dx + dy) * c;
    best = min(best, dx * c + b + dy * a);
    best = min(best, dy * c + b + dx * a);
    return best;
}
inline ll pack(pair<ll, pair<int, int>> xx) {
    return xx.first * 360000ll + (600ll * xx.second.first + xx.second.second);
}
inline pair<ll, pair<int, int>> unpack(ll xx) {
    ll k = xx % 360000ll;
    return {xx / 360000ll, {k / 600ll, k % 600ll}};
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    memset(dist, -1, sizeof(dist));
    int h, w; cin >> h >> w;
    h ++; w ++;
    cin >> a >> b >> c;
    vector<pair<int, int>> players;
    int n; cin >> n;
    int starti, startj, endi, endj;
    for (int i = 0; i < n; i ++) {
        int s, t; cin >> s >> t;
        players.push_back({s, t});
        if (i == 0)
            starti = s, startj = t;
        else if (i == n - 1)
            endi = s, endj = t;
    }
    // multisource bfs
    queue<pair<int, int>> q;
    for (auto a : players) {
        dist[a.first][a.second] = 0;
        q.push(a);
    }
    while (q.size()) {
        pair<int, int> cur = q.front(); q.pop();
        int curdist = dist[cur.first][cur.second];
        if (cur.first > 0 && dist[cur.first - 1][cur.second] == -1) {
            q.push({cur.first - 1, cur.second});
            dist[cur.first - 1][cur.second] = curdist + 1;
        }
        if (cur.first < h - 1 && dist[cur.first + 1][cur.second] == -1) {
            q.push({cur.first + 1, cur.second});
            dist[cur.first + 1][cur.second] = curdist + 1;
        }
        if (cur.second > 0 && dist[cur.first][cur.second - 1] == -1) {
            q.push({cur.first, cur.second - 1});
            dist[cur.first][cur.second - 1] = curdist + 1;
        }
        if (cur.second < w - 1 && dist[cur.first][cur.second + 1] == -1) {
            q.push({cur.first, cur.second + 1});
            dist[cur.first][cur.second + 1] = curdist + 1;
        }
    }
    // calculate answer
    set<ll> pq;
    for (int i = 0; i < h; i ++)
        for (int j = 0; j < w; j ++) {
            // initial distance
            ll curdist = calc_cost(abs(i - starti), abs(j - startj));
            curdist += dist[i][j] * c;
            curdist = min(curdist, abs(i - starti) * c + abs(j - startj) * c);
            dist_2[i][j] = curdist;
            pq.insert(pack({curdist, {i, j}}));
        }
    ll best = 1e18;
    while (pq.size()) {
        auto cur = unpack(*pq.begin());
        pq.erase(pq.begin());
        ll curdist = cur.first;
        int i = cur.second.first, j = cur.second.second;
        // send straight to finish
        // cout << curdist << " " << i << " " << j << endl;
        best = min(best, curdist + calc_cost(abs(i - endi), abs(j - endj)));
        for (int ii = 0; ii < h; ii ++) {
            ll newdist = curdist + calc_cost(abs(ii - i), 0) + dist[ii][j] * c;
            newdist = min(newdist, curdist + abs(ii - i) * c);
            if (dist_2[ii][j] > newdist) {
                pq.erase(pack({dist_2[ii][j], {ii, j}}));
                dist_2[ii][j] = newdist;
                pq.insert(pack({newdist, {ii, j}}));
            }
        }
        for (int jj = 0; jj < w; jj ++) {
            ll newdist = curdist + calc_cost(abs(jj - j), 0) + dist[i][jj] * c;
            newdist = min(newdist, curdist + abs(jj - j) * c);
            if (dist_2[i][jj] > newdist) {
                pq.erase(pack({dist_2[i][jj], {i, jj}}));
                dist_2[i][jj] = newdist;
                pq.insert(pack({newdist, {i, jj}}));
            }
        }
    }
    cout << best << endl;
    return 0;
}

Compilation message

soccer.cpp: In function 'int main()':
soccer.cpp:88:67: warning: 'endj' may be used uninitialized in this function [-Wmaybe-uninitialized]
   88 |         best = min(best, curdist + calc_cost(abs(i - endi), abs(j - endj)));
      |                                                                 ~~^~~~~~
soccer.cpp:88:52: warning: 'endi' may be used uninitialized in this function [-Wmaybe-uninitialized]
   88 |         best = min(best, curdist + calc_cost(abs(i - endi), abs(j - endj)));
      |                                                  ~~^~~~~~
soccer.cpp:34:17: warning: 'startj' may be used uninitialized in this function [-Wmaybe-uninitialized]
   34 |     int starti, startj, endi, endj;
      |                 ^~~~~~
soccer.cpp:34:9: warning: 'starti' may be used uninitialized in this function [-Wmaybe-uninitialized]
   34 |     int starti, startj, endi, endj;
      |         ^~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 140 ms 7256 KB Output is correct
2 Correct 1 ms 4188 KB Output is correct
3 Correct 865 ms 15976 KB Output is correct
4 Correct 1344 ms 16092 KB Output is correct
5 Correct 171 ms 8536 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1016 ms 15988 KB Output is correct
2 Correct 1037 ms 16220 KB Output is correct
3 Correct 710 ms 13648 KB Output is correct
4 Correct 829 ms 16208 KB Output is correct
5 Correct 770 ms 13836 KB Output is correct
6 Correct 868 ms 16232 KB Output is correct
7 Correct 1004 ms 16232 KB Output is correct
8 Correct 1018 ms 16232 KB Output is correct
9 Correct 987 ms 16468 KB Output is correct
10 Correct 96 ms 6236 KB Output is correct
11 Correct 1022 ms 16232 KB Output is correct
12 Correct 1094 ms 16212 KB Output is correct
13 Correct 628 ms 13840 KB Output is correct
14 Correct 1029 ms 16232 KB Output is correct
15 Correct 753 ms 13648 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 140 ms 7256 KB Output is correct
2 Correct 1 ms 4188 KB Output is correct
3 Correct 865 ms 15976 KB Output is correct
4 Correct 1344 ms 16092 KB Output is correct
5 Correct 171 ms 8536 KB Output is correct
6 Correct 1016 ms 15988 KB Output is correct
7 Correct 1037 ms 16220 KB Output is correct
8 Correct 710 ms 13648 KB Output is correct
9 Correct 829 ms 16208 KB Output is correct
10 Correct 770 ms 13836 KB Output is correct
11 Correct 868 ms 16232 KB Output is correct
12 Correct 1004 ms 16232 KB Output is correct
13 Correct 1018 ms 16232 KB Output is correct
14 Correct 987 ms 16468 KB Output is correct
15 Correct 96 ms 6236 KB Output is correct
16 Correct 1022 ms 16232 KB Output is correct
17 Correct 1094 ms 16212 KB Output is correct
18 Correct 628 ms 13840 KB Output is correct
19 Correct 1029 ms 16232 KB Output is correct
20 Correct 753 ms 13648 KB Output is correct
21 Correct 174 ms 8536 KB Output is correct
22 Correct 1380 ms 16216 KB Output is correct
23 Correct 1330 ms 15048 KB Output is correct
24 Correct 1273 ms 16252 KB Output is correct
25 Correct 1163 ms 16468 KB Output is correct
26 Correct 1434 ms 16296 KB Output is correct
27 Correct 763 ms 16812 KB Output is correct
28 Correct 1164 ms 16844 KB Output is correct
29 Execution timed out 3044 ms 16844 KB Time limit exceeded
30 Halted 0 ms 0 KB -