Submission #924626

#TimeUsernameProblemLanguageResultExecution timeMemory
924626esomerMaze (JOI23_ho_t3)C++17
100 / 100
1881 ms160984 KiB
#include <bits/stdc++.h> using namespace std; int dirI[] = {0, 0, 1, -1}; int dirJ[] = {1, -1, 0, 0}; int R, C, N; bool isBest(int d1, int d2, pair<int, int>& p){ int mn1, mx1, mn2, mx2; if(d1 < d2){ mn1 = d1; mx1 = d2; }else{ mn1 = d2; mx1 = d1; } if(p.first<p.second){ mn2 = p.first; mx2 = p.second; }else{ mn2 = p.second; mx2 = p.first; } if(!((mx1 <= N && mn1 < N) || (mx2 <= N && mn2 < N))) return false; if(mx1 == mx2) return mn1 < mn2; else return mx1 < mx2; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> R >> C >> N; int Sr, Sc, Gr, Gc; cin >> Sr >> Sc >> Gr >> Gc; Sr--; Sc--; Gr--; Gc--; vector<string> v(R); for(auto &i : v) cin >> i; vector<pair<int, int>> added = {{Sr, Sc}}; vector<vector<int>> dist(R, vector<int>(C, 1e9)); vector<vector<bool>> vis(R, vector<bool>(C, false)); vector<vector<pair<int, int>>> best(R, vector<pair<int, int>>(C, {1e9, 1e9})); dist[Sr][Sc] = 0; for(int t = 0; t < 2*R*C; t++){ if(t==0){ //Time to freely expand; queue<pair<int, int>> q; for(pair<int, int>& p : added){ q.push(p); } while(!q.empty()){ int i = q.front().first; int j = q.front().second; q.pop(); if(i == Gr && j == Gc){ cout << dist[i][j] << "\n"; return 0; } // cout << "i " << i+1 << " j " << j+1 << " dist " << dist[i][j] << "\n"; for(int k = 0; k < 4; k++){ int ai = dirI[k]; int aj = dirJ[k]; if(i + ai < 0 || i + ai >= R || j + aj < 0 || j + aj >= C) continue; int ni = i + ai; int nj = j + aj; // cout << "ni " << ni << " nj " << nj << "\n"; if(v[ni][nj] == '.' && dist[ni][nj] > dist[i][j]){ dist[ni][nj] = dist[i][j]; added.push_back({ni, nj}); q.push({ni, nj}); } } } }else{ priority_queue<pair<int, int>> q; int d = 0; for(pair<int, int>& p : added){ q.push({0, p.first*C+p.second}); best[p.first][p.second] = {0, 0}; d = dist[p.first][p.second]; vis[p.first][p.second] = false; } added.clear(); while(!q.empty()){ int val = q.top().second; q.pop(); int i = val/C; int j = val%C; if(i == Gr && j == Gc){ cout << dist[i][j] << "\n"; return 0; } if(vis[i][j]) continue; vis[i][j] = true; if(best[i][j].first >= N || best[i][j].second >= N){ added.push_back({i, j}); } for(int k = 0; k < 4; k++){ int ai = dirI[k]; int aj = dirJ[k]; if(i + ai < 0 || i + ai >= R || j + aj < 0 || j + aj >= C) continue; int ni = i + ai; int nj = j + aj; if(dist[ni][nj] > d && isBest(best[i][j].first+abs(ai), best[i][j].second+abs(aj), best[ni][nj])){ dist[ni][nj] = d+1; best[ni][nj] = {best[i][j].first+abs(ai), best[i][j].second+abs(aj)}; q.push({-max(best[ni][nj].first, best[ni][nj].second)*(N+2)+min(best[ni][nj].first, best[ni][nj].second), ni*C+ nj}); }else if(dist[ni][nj] > d + 1 && v[ni][nj] == '.'){ dist[ni][nj] = d + 1; q.push({2e9, ni*C+ nj}); } } } } } cout << dist[Gr][Gc] << "\n"; }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...