Submission #782155

#TimeUsernameProblemLanguageResultExecution timeMemory
782155HoriaHaivasAwesome Arrowland Adventure (eJOI19_adventure)C++14
100 / 100
86 ms21568 KiB
/* "TLE is like the wind, always by my side" - Yasuo - 2022 - */ #include <bits/stdc++.h> #define debug(x) cerr << #x << " " << x << "\n" #define debugs(x) cerr << #x << " " << x << " " #pragma GCC optimize("Ofast") using namespace std; struct edge { int endnode; int cost; }; struct pqnode { int node; int cost; }; struct cmp { bool operator()(pqnode a, pqnode b) { return a.cost>b.cost; } }; int n,m; char a[501][501]; int mincost[250001]; vector<edge> nodes[250001]; bool visited[250001]; priority_queue<pqnode,vector<pqnode>,cmp> pq; const int inf = 1e9; int compress(int l, int c) { return m*(l-1)+c; } void dijkstra(int source) { int i,c,currnode; for (i=1;i<=n*m;i++) { mincost[i]=inf; } pq.push({source,0}); while (!pq.empty()) { currnode=pq.top().node; c=pq.top().cost; pq.pop(); if (!visited[currnode]) { visited[currnode]=1; mincost[currnode]=c; for (i=0;i<nodes[currnode].size();i++) { if (!visited[nodes[currnode][i].endnode] && c+nodes[currnode][i].cost<mincost[nodes[currnode][i].endnode]) pq.push({nodes[currnode][i].endnode,c+nodes[currnode][i].cost}); } } } } void addedge(int node, int l, int c, char dir) { if (dir=='N') { if (l-1>0 && l-1<n+1 && c>0 && c<m+1) nodes[node].push_back({compress(l-1,c),0}); if (l+1>0 && l+1<n+1 && c>0 && c<m+1) nodes[node].push_back({compress(l+1,c),2}); if (l>0 && l<n+1 && c-1>0 && c-1<m+1) nodes[node].push_back({compress(l,c-1),3}); if (l>0 && l<n+1 && c+1>0 && c+1<m+1) nodes[node].push_back({compress(l,c+1),1}); } if (dir=='W') { if (l-1>0 && l-1<n+1 && c>0 && c<m+1) nodes[node].push_back({compress(l-1,c),1}); if (l+1>0 && l+1<n+1 && c>0 && c<m+1) nodes[node].push_back({compress(l+1,c),3}); if (l>0 && l<n+1 && c-1>0 && c-1<m+1) nodes[node].push_back({compress(l,c-1),0}); if (l>0 && l<n+1 && c+1>0 && c+1<m+1) nodes[node].push_back({compress(l,c+1),2}); } if (dir=='S') { if (l-1>0 && l-1<n+1 && c>0 && c<m+1) nodes[node].push_back({compress(l-1,c),2}); if (l+1>0 && l+1<n+1 && c>0 && c<m+1) nodes[node].push_back({compress(l+1,c),0}); if (l>0 && l<n+1 && c-1>0 && c-1<m+1) nodes[node].push_back({compress(l,c-1),1}); if (l>0 && l<n+1 && c+1>0 && c+1<m+1) nodes[node].push_back({compress(l,c+1),3}); } if (dir=='E') { if (l-1>0 && l-1<n+1 && c>0 && c<m+1) nodes[node].push_back({compress(l-1,c),3}); if (l+1>0 && l+1<n+1 && c>0 && c<m+1) nodes[node].push_back({compress(l+1,c),1}); if (l>0 && l<n+1 && c-1>0 && c-1<m+1) nodes[node].push_back({compress(l,c-1),2}); if (l>0 && l<n+1 && c+1>0 && c+1<m+1) nodes[node].push_back({compress(l,c+1),0}); } } int main() { ifstream fin("secvp.in"); ofstream fout("secvp.out"); ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int i,j; cin >> n >> m; for (i=1;i<=n;i++) { for (j=1;j<=m;j++) { cin >> a[i][j]; } } for (i=1;i<=n;i++) { for (j=1;j<=m;j++) { if (a[i][j]!='X') addedge(compress(i,j),i,j,a[i][j]); } } dijkstra(1); if (mincost[n*m]!=inf) cout << mincost[n*m]; else cout << -1; }

Compilation message (stderr)

adventure.cpp: In function 'void dijkstra(int)':
adventure.cpp:62:25: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<edge>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   62 |               for (i=0;i<nodes[currnode].size();i++)
      |                        ~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...