Submission #127189

#TimeUsernameProblemLanguageResultExecution timeMemory
127189EntityITSoccer (JOI17_soccer)C++14
100 / 100
693 ms21276 KiB
#include<bits/stdc++.h> using namespace std; #define fi first #define se second using ii = pair<int, int>; using ll = long long; const int H = 505, W = H, N = (int)1e5 + 5; const ll infll = (ll)1e18 + 123; int h, w, a, b, c, n, s[N], t[N], mn[H][W], dx[] = { -1, 0, 1, 0 }, dy[] = { 0, 1, 0, -1 }; ll dp[H][W][6]; /* 0, 1, 2, 3: direction; 4: carried; 5: not carried; */ struct State { int x, y, sta; State (int _x = 0, int _y = 0, int _sta = 0) : x(_x), y(_y), sta(_sta) {} bool operator< (const State &_) const { return make_pair(x, make_pair(y, sta) ) < make_pair(_.x, make_pair(_.y, _.sta) ); } }; bool validCell (int x, int y) { return x >= 0 && y >= 0 && x <= h && y <= w; } void bfs () { memset(mn, -1, sizeof mn); queue<ii> q; for (int i = 1; i <= n; ++i) { mn[ s[i] ][ t[i] ] = 0; if (i != n) q.push( { s[i], t[i] } ); } while (!q.empty() ) { int x = q.front().fi, y = q.front().se; q.pop(); for (int _ = 0; _ < 4; ++_) { int nX = x + dx[_], nY = y + dy[_]; if (validCell(nX, nY) && mn[nX][nY] == -1) { mn[nX][nY] = mn[x][y] + 1; q.push( { nX, nY } ); } } } } int main () { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> h >> w >> a >> b >> c >> n; for (int i = 1; i <= n; ++i) cin >> s[i] >> t[i]; bfs(); for (int i = 0; i < H; ++i) { for (int j = 0; j < W; ++j) { for (int k = 0; k < 6; ++k) dp[i][j][k] = infll; } } priority_queue<pair<ll, State>, vector< pair<ll, State> >, greater< pair<ll, State> > > pq; dp[ s[1] ][ t[1] ][4] = 0; pq.push( { dp[ s[1] ][ t[1] ][4], State(s[1], t[1], 4) } ); while (!pq.empty() ) { auto tmp = pq.top(); pq.pop(); int x = tmp.se.x, y = tmp.se.y, sta = tmp.se.sta; if (tmp.fi > dp[x][y][sta]) continue ; if (sta == 5) { if (dp[x][y][4] > dp[x][y][sta] + 1LL * c * mn[x][y]) { dp[x][y][4] = dp[x][y][sta] + 1LL * c * mn[x][y]; pq.push( { dp[x][y][4], State(x, y, 4) } ); } } else if (sta == 4) { for (int _ = 0; _ < 4; ++_) { int nX = x + dx[_], nY = y + dy[_]; if (!validCell(nX, nY) ) continue ; if (dp[nX][nY][4] > dp[x][y][sta] + c) { dp[nX][nY][4] = dp[x][y][sta] + c; pq.push( { dp[nX][nY][4], State(nX, nY, 4) } ); } if (dp[nX][nY][_] > dp[x][y][sta] + a + b) { dp[nX][nY][_] = dp[x][y][sta] + a + b; pq.push( { dp[nX][nY][_], State(nX, nY, _) } ); } } } else { int nX = x + dx[sta], nY = y + dy[sta]; if (validCell(nX, nY) ) { if (dp[nX][nY][sta] > dp[x][y][sta] + a) { dp[nX][nY][sta] = dp[x][y][sta] + a; pq.push( { dp[nX][nY][sta], State(nX, nY, sta) } ); } } if (dp[x][y][5] > dp[x][y][sta]) { dp[x][y][5] = dp[x][y][sta]; pq.push( { dp[x][y][5], State(x, y, 5) } ); } } } cout << dp[ s[n] ][ t[n] ][4]; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...