Submission #675277

#TimeUsernameProblemLanguageResultExecution timeMemory
675277vjudge1Portals (BOI14_portals)C++17
100 / 100
312 ms9856 KiB
#include<bits/stdc++.h> #define task "A" #define ll long long #define ld long double #define fi first #define se second #define pb push_back #define pii pair<int, int> using namespace std; const int maxN = 1e3 + 5; const int mod = 1e9 + 7; const ll inf = 1e18; int m, n; string a[maxN]; pair<int, int> s, t; int d[maxN][maxN]; int dx[4] = {1, 0, -1, 0}; int dy[4] = {0, 1, 0, -1}; vector<int> hang[maxN], cot[maxN]; struct TPQRect { int x, y, dlab; bool operator < (const TPQRect& other) const { return other.dlab < dlab; } bool Valid() const { return d[x][y] == dlab; } }; void Input() { cin >> m >> n; for(int i = 1; i <= m; i++) { hang[i].pb(0); hang[i].pb(n + 1); } for(int i = 1; i <= n; i++) { cot[i].pb(0); cot[i].pb(m + 1); } for(int i = 1; i <= m; i++) { cin >> a[i]; a[i] = ' ' + a[i]; for(int j = 1; j <= n; j++) { if(a[i][j] == 'S') s = {i, j}; if(a[i][j] == 'C') t = {i, j}; if(a[i][j] == '#') { hang[i].pb(j); cot[j].pb(i); } } } for(int i = 1; i <= m; i++) sort(hang[i].begin(), hang[i].end()); for(int i = 1; i <= n; i++) sort(cot[i].begin(), cot[i].end()); } void Dijkstra() { priority_queue<TPQRect> pq; memset(d, 3, sizeof d); d[s.fi][s.se] = 0; pq.push({s.fi, s.se, 0}); while(!pq.empty()) { TPQRect R = pq.top(); pq.pop(); if(!R.Valid()) continue; int x = R.x, y = R.y; for(int i=0; i<4; i++) { int u = x + dx[i], v = y + dy[i]; if(u < 1 || u > m || v < 1 || v > n || a[u][v] == '#') continue; if(d[u][v] > d[x][y] + 1) { d[u][v] = d[x][y] + 1; pq.push({u, v, d[u][v]}); } } vector<pii> vc; int id = lower_bound(hang[x].begin(), hang[x].end(), y) - hang[x].begin(); vc.pb({x, hang[x][id] - 1}); id--; vc.pb({x, hang[x][id] + 1}); id = lower_bound(cot[y].begin(), cot[y].end(), x) - cot[y].begin(); vc.pb({cot[y][id] - 1, y}); id--; vc.pb({cot[y][id] + 1, y}); for(int i=0; i<4; i++) for(int j=0; j<4; j++) { int w = abs(x - vc[j].fi) + abs(y - vc[j].se) + 1; if(d[vc[i].fi][vc[i].se] > d[x][y] + w) { d[vc[i].fi][vc[i].se] = d[x][y] + w; pq.push({vc[i].fi, vc[i].se, d[vc[i].fi][vc[i].se]}); } } } } void Solve() { Dijkstra(); cout << d[t.fi][t.se]; } signed main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); if (fopen(task".INP","r")) { freopen(task".INP","r",stdin); freopen(task".OUT","w",stdout); } Input(); Solve(); }

Compilation message (stderr)

portals.cpp: In function 'int main()':
portals.cpp:128:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  128 |         freopen(task".INP","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
portals.cpp:129:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  129 |         freopen(task".OUT","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#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...