제출 #32813

#제출 시각아이디문제언어결과실행 시간메모리
32813aomeSoccer (JOI17_soccer)C++14
100 / 100
843 ms28148 KiB
#include <bits/stdc++.h> #define fi first #define se second using namespace std; #define int long long typedef pair<int, int> ii; typedef pair<ii, ii> p; const int N = 505; const int INF = 1e18; int h, w; int n, A, B, C; int endX, endY; int res = INF; int g[N][N]; int f[N][N][5]; int dx[] = {-1, 1, 0, 0}; int dy[] = {0, 0, -1, 1}; priority_queue<p> pq; signed main() { ios::sync_with_stdio(false); cin >> h >> w; cin >> A >> B >> C; cin >> n; for (int i = 0; i <= h; ++i) { for (int j = 0; j <= w; ++j) { for (int k = 0; k < 5; ++k) { f[i][j][k] = INF; } } } memset(g, -1, sizeof g); queue<ii> qu; for (int i = 0; i < n; ++i) { int x, y; cin >> x >> y; if (!i) { f[x][y][4] = 0, pq.push(p(ii(0, 4), ii(x, y))); } if (i == n - 1) { endX = x, endY = y; } g[x][y] = 0, qu.push(ii(x, y)); } while (qu.size()) { int x = qu.front().fi, y = qu.front().se; qu.pop(); for (int i = 0; i < 4; ++i) { int nx = x + dx[i], ny = y + dy[i]; if (nx < 0 || ny < 0 || nx > h || ny > w) continue; if (g[nx][ny] == -1) { g[nx][ny] = g[x][y] + 1, qu.push(ii(nx, ny)); } } } while (pq.size()) { int x = pq.top().se.fi, y = pq.top().se.se, F = -pq.top().fi.fi, t = pq.top().fi.se; pq.pop(); if (F != f[x][y][t]) continue; res = min(res, F + (abs(x - endX) + abs(y - endY)) * C); if (t != 4 && f[x][y][4] > f[x][y][t] + g[x][y] * C) { f[x][y][4] = f[x][y][t] + g[x][y] * C, pq.push(p(ii(-f[x][y][4], 4), ii(x, y))); } if (t != 4) { int nx = x + dx[t], ny = y + dy[t]; if (nx < 0 || ny < 0 || nx > h || ny > w) {} else if (f[nx][ny][t] > f[x][y][t] + A) { f[nx][ny][t] = f[x][y][t] + A, pq.push(p(ii(-f[nx][ny][t], t), ii(nx, ny))); } } if (t == 4) { for (int i = 0; i < 4; ++i) { int nx = x + dx[i], ny = y + dy[i]; if (nx < 0 || ny < 0 || nx > h || ny > w) continue; if (f[nx][ny][4] > f[x][y][4] + C) { f[nx][ny][4] = f[x][y][4] + C, pq.push(p(ii(-f[nx][ny][4], 4), ii(nx, ny))); } if (f[nx][ny][i] > f[x][y][4] + A + B) { f[nx][ny][i] = f[x][y][4] + A + B, pq.push(p(ii(-f[nx][ny][i], i), ii(nx, ny))); } } } } cout << res << '\n'; // int x, y, t; // while (cin >> x >> y >> t) cout << f[x][y][t] << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...