Submission #287272

#TimeUsernameProblemLanguageResultExecution timeMemory
287272AlexLuchianovPortals (BOI14_portals)C++14
100 / 100
479 ms52616 KiB
#include <iostream> #include <vector> #include <cassert> #include <algorithm> #include <cmath> #include <queue> using ll = long long; #define MIN(a, b) (((a) < (b)) ? (a) : (b)) #define MAX(a, b) (((a) < (b)) ? (b) : (a)) int const nmax = 2000; int const inf = nmax * nmax; std::string mat[1 + nmax]; int n, m; bool valid(int x, int y) { return 0 <= x && x < n && 0 <= y && y < m; } int const iplus[4] = {0, 0, 1, -1}; int const jplus[4] = {1, -1, 0, 0}; int dist[1 + nmax][1 + nmax]; int fast[4][1 + nmax][1 + nmax]; void precompute() { std::queue<std::pair<int,int>> q; for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) { dist[i][j] = inf; if(mat[i][j] != '#') { for(int h = 0; h < 4; h++) { int newx = i + iplus[h]; int newy = j + jplus[h]; if(valid(newx, newy) == 0 || mat[newx][newy] == '#') { dist[i][j] = 1; q.push({i, j}); } } } } while(0 < q.size()) { int x = q.front().first; int y = q.front().second; q.pop(); for(int h = 0; h < 4; h++) { int newx = x + iplus[h]; int newy = y + jplus[h]; if(valid(newx, newy) == 1 && mat[newx][newy] != '#' && dist[newx][newy] == inf) { q.push({newx, newy}); dist[newx][newy] = dist[x][y] + 1; } } } for(int h = 0; h < 4; h++) { for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) if(mat[i][j] != '#') { int newx = i + iplus[h]; int newy = j + jplus[h]; if(valid(newx, newy) && mat[newx][newy] != '#') fast[h][i][j] = fast[h][newx][newy] + 1; } for(int i = n - 1; 0 <= i; i--) for(int j = m - 1; 0 <= j; j--) if(mat[i][j] != '#') { int newx = i + iplus[h]; int newy = j + jplus[h]; if(valid(newx, newy) && mat[newx][newy] != '#') fast[h][i][j] = fast[h][newx][newy] + 1; } } } struct State{ int x; int y; int cost; bool operator < (State const a) const { return a.cost < cost; } }; int dp[1 + nmax][1 + nmax]; int main() { std::ios::sync_with_stdio(0); std::cin.tie(0); std::cin >> n >> m; for(int i = 0; i < n; i++) std::cin >> mat[i]; int x, y; int x2, y2; for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) if(mat[i][j] == 'S') { x = i; y = j; } else if(mat[i][j] == 'C') { x2 = i; y2 = j; } precompute(); for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) dp[i][j] = inf; std::priority_queue<State> pq; dp[x][y] = 0; pq.push({x, y, 0}); while(0 < pq.size()) { int x = pq.top().x; int y = pq.top().y; int cost = pq.top().cost; pq.pop(); if(cost == dp[x][y]) { for(int h = 0; h < 4; h++) { int newx = x + iplus[h]; int newy = y + jplus[h]; if(valid(newx, newy) && mat[newx][newy] != '#') { if(dp[x][y] + 1 < dp[newx][newy]) { dp[newx][newy] = dp[x][y] + 1; pq.push({newx, newy, dp[newx][newy]}); } } newx = x + iplus[h] * fast[h][x][y]; newy = y + jplus[h] * fast[h][x][y]; if(valid(newx, newy) && mat[newx][newy] != '#') { if(dp[x][y] + dist[x][y] < dp[newx][newy]) { dp[newx][newy] = dp[x][y] + dist[x][y]; pq.push({newx, newy, dp[newx][newy]}); } } } } } std::cout << dp[x2][y2]; return 0; }

Compilation message (stderr)

portals.cpp: In function 'int main()':
portals.cpp:140:25: warning: 'y2' may be used uninitialized in this function [-Wmaybe-uninitialized]
  140 |   std::cout << dp[x2][y2];
      |                         ^
portals.cpp:140:25: warning: 'x2' may be used uninitialized in this function [-Wmaybe-uninitialized]
portals.cpp:112:10: warning: 'y' may be used uninitialized in this function [-Wmaybe-uninitialized]
  112 |   pq.push({x, y, 0});
      |   ~~~~~~~^~~~~~~~~~~
portals.cpp:112:10: warning: 'x' may be used uninitialized in this function [-Wmaybe-uninitialized]
#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...