Submission #21831

#TimeUsernameProblemLanguageResultExecution timeMemory
21831ngkan146Portals (BOI14_portals)C++14
100 / 100
279 ms30640 KiB
#include <bits/stdc++.h>
#define fi first
#define se second
using namespace std;
typedef pair<int,int> ii;
int dx[] = {1,0,-1,0};
int dy[] = {0,1,0,-1};
int n,m,xs,ys,xe,ye;
string s[1005];
int block[1005][1005][4];
int d[1005][1005], mini[1005][1005];
priority_queue <ii,vector<ii>,greater<ii> > pq;
int prep(){
   iostream::sync_with_stdio(0);
   cin >> n >> m;
   for(int i=1;i<=n;i++)
      cin >> s[i], s[i] = '#' + s[i] + '#';
   for(int i=1;i<=m+3;i++)
      s[0].push_back('#'), s[n+1].push_back('#');
   for(int i=1;i<=n;i++){
      for(int j=1;j<=m;j++)
         if (s[i][j] == 'S') xs = i, ys = j;
         else if (s[i][j] == 'C') xe = i, ye = j;
   }
   for(int i=1;i<=n;i++){
      for(int j=1;j<=m;j++)
         if (s[i][j-1] == '#') block[i][j][3] = j;
         else block[i][j][3] = block[i][j-1][3];
      for(int j=m;j>=1;j--){
         if (s[i][j+1] == '#') block[i][j][1] = j;
         else block[i][j][1] = block[i][j+1][1];
      }
   }
   for(int j=1;j<=m;j++){
      for(int i=1;i<=n;i++)
         if (s[i-1][j] == '#') block[i][j][0] = i;
         else block[i][j][0] = block[i-1][j][0];
      for(int i=n;i>=1;i--)
         if (s[i+1][j] == '#') block[i][j][2] = i;
         else block[i][j][2] = block[i+1][j][2];
   }
   for(int i=0;i<=n+1;i++)
      fill(d[i],d[i]+m+2,(int) 1e9),
      fill(mini[i], mini[i]+m+2,(int) 1e9);
   d[xs][ys] = 0;
}
void prep1(){
   queue <int> q;
   for(int i=0;i<=n+1;i++)
      for(int j=0;j<=m+1;j++)
         if (s[i][j] == '#') mini[i][j] = 0, q.push(i*1005 + j);
   while(q.size()){
      int x = q.front()/1005;
      int y = q.front()%1005;
      q.pop();
      for(int k=0;k<4;k++){
         int X = x + dx[k];
         int Y = y + dy[k];
         if (X < 0 || n+1 < X || Y < 0 || m+1 < Y) continue;
         if (mini[X][Y] == (int) 1e9)
            mini[X][Y] = mini[x][y] + 1,
            q.push(X*1005 + Y);
      }
   }
}
int main(){
   prep();
   prep1();
   pq.push(ii(0, xs * 1005 + ys));
   while(pq.size()){
      int x = pq.top().se/1005;
      int y = pq.top().se%1005;
      pq.pop();
      for(int k=0;k<4;k++){
         int X = x + dx[k];
         int Y = y + dy[k];
         if (s[X][Y] == '#') continue;
         if (d[X][Y] > d[x][y] + 1)
            d[X][Y] = d[x][y] + 1,
            pq.push(ii(d[X][Y], X*1005 + Y));
      }
      if (d[block[x][y][0]][y] > d[x][y] + mini[x][y])
         d[block[x][y][0]][y] = d[x][y] + mini[x][y],
         pq.push(ii(d[x][y] + mini[x][y], block[x][y][0]*1005 + y));
      if (d[block[x][y][2]][y] > d[x][y] + mini[x][y])
         d[block[x][y][2]][y] = d[x][y] + mini[x][y],
         pq.push(ii(d[x][y] + mini[x][y],block[x][y][2]*1005 + y));
      if (d[x][block[x][y][1]] > d[x][y] + mini[x][y])
         d[x][block[x][y][1]] = d[x][y] + mini[x][y],
         pq.push(ii(d[x][y] + mini[x][y],x*1005 + block[x][y][1]));
      if (d[x][block[x][y][3]] > d[x][y] + mini[x][y])
         d[x][block[x][y][3]] = d[x][y] + mini[x][y],
         pq.push(ii(d[x][y] + mini[x][y],x*1005 + block[x][y][3]));
   }
   cout << d[xe][ye];
}
/*
4 4
.#.C
.#.#
....
S...
*/

Compilation message (stderr)

portals.cpp: In function 'int prep()':
portals.cpp:46:1: warning: no return statement in function returning non-void [-Wreturn-type]
 }
 ^
#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...