Submission #87863

#TimeUsernameProblemLanguageResultExecution timeMemory
87863KCSCSoccer (JOI17_soccer)C++14
100 / 100
642 ms23584 KiB
#include <bits/stdc++.h> using namespace std; const int DIM = 505; const int dx[5] = {0, -1, 0, 1, 0}; const int dy[5] = {0, 0, 1, 0, -1}; long long dp[DIM][DIM][5], dst[DIM][DIM]; pair<int, int> pos[DIM * DIM]; deque<pair<int, int>> que; priority_queue<pair<long long, tuple<int, int, int>>, vector<pair<long long, tuple<int, int, int>>>, greater<pair<long long, tuple<int, int, int>>>> prq; int main(void) { #ifdef HOME freopen("soccer.in", "r", stdin); freopen("soccer.out", "w", stdout); #endif int n, m, a, b, c, k; cin >> n >> m >> a >> b >> c >> k; for (int i = 0; i <= n; ++i) { for (int j = 0; j <= m; ++j) { dst[i][j] = 1LL << 60; for (int k = 0; k <= 4; ++k) { dp[i][j][k] = 1LL << 60; } } } for (int i = 1; i <= k; ++i) { int x, y; cin >> x >> y; dst[x][y] = 0; pos[i] = make_pair(x, y); } for (int i = 0; i <= n; ++i) { for (int j = 0; j <= m; ++j) { if (dst[i][j] == 0) { que.push_back(make_pair(i, j)); } } } while (que.size()) { int x, y; tie(x, y) = que.front(); que.pop_front(); for (int d = 1; d <= 4; ++d) { int xx = x + dx[d], yy = y + dy[d]; if (xx >= 0 and xx <= n and yy >= 0 and yy <= m and dst[xx][yy] == 1LL << 60) { dst[xx][yy] = dst[x][y] + c; que.push_back(make_pair(xx, yy)); } } } dp[pos[1].first][pos[1].second][0] = 0; prq.push(make_pair(0, make_tuple(pos[1].first, pos[1].second, 0))); while (prq.size()) { long long ds; int x, y, z; ds = prq.top().first; tie(x, y, z) = prq.top().second; prq.pop(); if (dp[x][y][z] != ds) { continue; } if (z == 0) { for (int d = 1; d <= 4; ++d) { if (dp[x][y][d] > dp[x][y][0] + b) { dp[x][y][d] = dp[x][y][0] + b; prq.push(make_pair(dp[x][y][d], make_tuple(x, y, d))); } int xx = x + dx[d], yy = y + dy[d]; if (xx >= 0 and xx <= n and yy >= 0 and yy <= m and dp[xx][yy][0] > dp[x][y][0] + c) { dp[xx][yy][0] = dp[x][y][0] + c; prq.push(make_pair(dp[xx][yy][0], make_tuple(xx, yy, 0))); } } } else { if (dp[x][y][0] > dp[x][y][z] + dst[x][y]) { dp[x][y][0] = dp[x][y][z] + dst[x][y]; prq.push(make_pair(dp[x][y][0], make_tuple(x, y, 0))); } int xx = x + dx[z], yy = y + dy[z]; if (xx >= 0 and xx <= n and yy >= 0 and yy <= m and dp[xx][yy][z] > dp[x][y][z] + a) { dp[xx][yy][z] = dp[x][y][z] + a; prq.push(make_pair(dp[xx][yy][z], make_tuple(xx, yy, z))); } } } cout << dp[pos[k].first][pos[k].second][0] << endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...