Submission #335360

#TimeUsernameProblemLanguageResultExecution timeMemory
335360ChrisTSoccer (JOI17_soccer)C++17
100 / 100
989 ms38340 KiB
#include <bits/stdc++.h> using namespace std; struct State { long long d; int x,y,z; bool operator< (const State &o) const { return d > o.d; } }; const int MN = 505; long long dist[MN][MN][5]; int pre[MN][MN], dx[4] = {0,0,1,-1}, dy[4] = {1,-1,0,0}; int main() { int n,m,a,b,c,k; scanf ("%d %d %d %d %d %d",&n,&m,&a,&b,&c,&k); queue<pair<int,int>> q; vector<pair<int,int>> bois(k); memset(pre,0x3f,sizeof pre); for (auto &[x,y] : bois) { scanf ("%d %d",&x,&y); pre[x][y] = 0; q.push({x,y}); } while (!q.empty()) { auto [x,y] = q.front(); q.pop(); for (int k = 0; k < 4; k++) { int nx = x + dx[k], ny = y + dy[k]; if (nx >= 1 && nx <= n && 1 <= ny && ny <= m && pre[x][y] + 1 < pre[nx][ny]) { pre[nx][ny] = pre[x][y] + 1; q.push({nx,ny}); } } } memset(dist,0x3f,sizeof dist); auto [sx,sy] = bois[0]; dist[sx][sy][0] = 0; priority_queue<State> pq; pq.push({0,sx,sy,0}); while (!pq.empty()) { auto [d,x,y,z] = pq.top(); pq.pop(); if (d > dist[x][y][z]) continue; if (!z) { for (int k = 0; k < 4; k++) { int nx = x + dx[k], ny = y + dy[k]; if (nx < 0 || nx > n || ny < 0 || ny > m) continue; if (d + c < dist[nx][ny][0]) { dist[nx][ny][0] = d + c; pq.push({d+c,nx,ny,0}); } if (d + a < dist[nx][ny][k+1]) { dist[nx][ny][k+1] = d + a; pq.push({d+a,nx,ny,k+1}); } } } else { if (d + b + (long long)a * pre[x][y] < dist[x][y][0]) { dist[x][y][0] = d + b + (long long)c * pre[x][y]; pq.push({dist[x][y][0],x,y,0}); } int nx = x + dx[z-1], ny = y + dy[z-1]; if (nx >= 0 && nx <= n && ny >= 0 && ny <= m && d + a < dist[nx][ny][z]) { dist[nx][ny][z] = d + a; pq.push({d+a,nx,ny,z}); } } } auto [ex,ey] = bois.back(); printf ("%lld\n",dist[ex][ey][0]); return 0; }

Compilation message (stderr)

soccer.cpp: In function 'int main()':
soccer.cpp:14:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   14 |  scanf ("%d %d %d %d %d %d",&n,&m,&a,&b,&c,&k);
      |  ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
soccer.cpp:18:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   18 |   scanf ("%d %d",&x,&y);
      |   ~~~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...