Submission #1306734

#TimeUsernameProblemLanguageResultExecution timeMemory
1306734nguyenkhangninh99Soccer (JOI17_soccer)C++20
100 / 100
300 ms22256 KiB
#include<bits/stdc++.h> using namespace std; #define int long long const int maxn = 5e2 + 5, inf = 1e16; int dist[maxn][maxn], res[maxn][maxn][5]; //0: up, 1: down, 2: right, 3: left, 4: kept int dx[] = {-1, 1, 0, 0}; int dy[] = {0, 0, -1, 1}; signed main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int h, w, a, b, c, n; cin >> h >> w >> a >> b >> c >> n; for(int i = 0; i <= h; i++){ for(int j = 0; j <= w; j++){ dist[i][j] = inf; for(int k = 0; k < 5; k++) res[i][j][k] = inf; } } int startx, starty, endx, endy; queue<pair<int, int>> q; for(int i = 1; i <= n; i++){ int x, y; cin >> x >> y; if(i == 1) startx = x, starty = y; if(i == n) endx = x, endy = y; dist[x][y] = 0; q.push({x, y}); } auto inside = [&](int x, int y){ return 0 <= x && x <= h && 0 <= y && y <= w; }; auto minimize = [&](int &x, int y){ if(x > y){ x = y; return true; }return false; }; while(!q.empty()){ auto [x, y] = q.front(); q.pop(); for (int i = 0; i < 4; i++){ int nx = x + dx[i], ny = y + dy[i]; if (inside(nx, ny) && dist[nx][ny] == inf){ dist[nx][ny] = dist[x][y] + 1; q.push({nx, ny}); } } } priority_queue<array<int, 4>, vector<array<int, 4>>, greater<array<int, 4>>> pq; res[startx][starty][4] = 0; pq.push({0, startx, starty, 4}); while(pq.size()){ auto [d, x, y, m] = pq.top(); pq.pop(); if(d > res[x][y][m]) continue; if(m == 4){ for(int i = 0; i < 4; i++){ if(minimize(res[x][y][i], d + b)) pq.push({res[x][y][i], x, y, i}); int nx = x + dx[i], ny = y + dy[i]; if(inside(nx, ny) && minimize(res[nx][ny][4], d + c)) pq.push({res[nx][ny][4], nx, ny, 4}); } }else{ int nx = x + dx[m], ny = y + dy[m]; if(inside(nx, ny) && minimize(res[nx][ny][m], d + a)) pq.push({res[nx][ny][m], nx, ny, m}); if(minimize(res[x][y][4], d + dist[x][y] * c)) pq.push({res[x][y][4], x, y, 4}); } } cout << res[endx][endy][4]; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...