Submission #1162754

#TimeUsernameProblemLanguageResultExecution timeMemory
1162754Nonoze포탈들 (BOI14_portals)C++20
0 / 100
0 ms328 KiB
/* * Author: Nonoze * Created: Thursday 06/03/2025 */ #include <bits/stdc++.h> using namespace std; #ifndef DEBUG #define dbg(...) #endif // #define cout cerr << "OUT: " #define endl '\n' #define endlfl '\n' << flush #define quit(x) return (void)(cout << x << endl) template<typename T> void read(T& x) { cin >> x;} template<typename T1, typename T2> void read(pair<T1, T2>& p) { read(p.first), read(p.second);} template<typename T> void read(vector<T>& v) { for (auto& x : v) read(x); } template<typename T1, typename T2> void read(T1& x, T2& y) { read(x), read(y); } template<typename T1, typename T2, typename T3> void read(T1& x, T2& y, T3& z) { read(x), read(y), read(z); } template<typename T1, typename T2, typename T3, typename T4> void read(T1& x, T2& y, T3& z, T4& zz) { read(x), read(y), read(z), read(zz); } template<typename T> void print(vector<T>& v) { for (auto& x : v) cout << x << ' '; cout << endl; } #define sz(x) (int)(x.size()) #define all(x) (x).begin(), (x).end() #define rall(x) (x).rbegin(), (x).rend() #define make_unique(v) sort(all(v)), v.erase(unique(all(v)), (v).end()) #define pb push_back #define mp(a, b) make_pair(a, b) #define fi first #define se second #define cmin(a, b) a = min(a, b) #define cmax(a, b) a = max(a, b) #define YES cout << "YES" << endl #define NO cout << "NO" << endl #define QYES quit("YES") #define QNO quit("NO") #define int long long #define double long double const int inf = numeric_limits<int>::max() / 4; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); const int MOD = 1e9+7, LOG=20; void solve(); signed main() { ios::sync_with_stdio(0); cin.tie(0); int tt=1; // cin >> tt; while(tt--) solve(); return 0; } int n, k, m; vector<string> a; vector<pair<int, int>> moves={{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; bool ok(int i, int j) { return i>=0 && i<n && j>=0 && j<m && a[i][j]!='#'; } void solve() { read(n, m); a.clear(), a.resize(n); read(a); vector<vector<int>> up(n, vector<int>(m, -1)), down(n, vector<int>(m, -1)), left(n, vector<int>(m, -1)), right(n, vector<int>(m, -1)); for (int i=0; i<n; i++) for (int j=0; j<m; j++) if (a[i][j]!='#') left[i][j]=(j?left[i][j-1]:-1)+1, up[i][j]=(i?up[i-1][j]:-1)+1; for (int i=n-1; i>=0; i--) for (int j=m-1; j>=0; j--) if (a[i][j]!='#') right[i][j]=(j+1<m?right[i][j+1]:-1)+1, down[i][j]=(i+1<n?down[i+1][j]:-1)+1; priority_queue<vector<int>> q; for (int i=0; i<n; i++) for (int j=0; j<m; j++) if (a[i][j]=='S') q.push({0, i, j, 0}); vector<vector<vector<int>>> dist(n, vector<vector<int>>(m, vector<int>(2, inf))); dist[q.top()[1]][q.top()[2]][0]=0; while (!q.empty()) { int d=-q.top()[0], i=q.top()[1], j=q.top()[2], already=q.top()[3]; q.pop(); if (dist[i][j][already]!=d) continue; for (auto [u, v]: moves) { if (ok(i+u, j+v) && dist[i+u][j+v][already]>d+1) { dist[i+u][j+v][already]=d+1; q.push({-d-1, i+u, j+v, already}); } } if (already) continue; int mini=min({left[i][j], right[i][j], up[i][j], down[i][j]})+1; if (dist[i][j-left[i][j]][1]>d+mini) { dist[i][j-left[i][j]][1]=d+mini; q.push({-d-mini, i, j-left[i][j], 1}); } if (dist[i][j+right[i][j]][1]>d+mini) { dist[i][j+right[i][j]][1]=d+mini; q.push({-d-mini, i, j+right[i][j], 1}); } if (dist[i-up[i][j]][j][1]>d+mini) { dist[i-up[i][j]][j][1]=d+mini; q.push({-d-mini, i-up[i][j], j, 1}); } if (dist[i+down[i][j]][j][1]>d+mini) { dist[i+down[i][j]][j][1]=d+mini; q.push({-d-mini, i+down[i][j], j, 1}); } } int ans=inf; for (int i=0; i<n; i++) for (int j=0; j<m; j++) if (a[i][j]=='C') ans=min(dist[i][j][0], dist[i][j][1]); cout << ans << endl; }
#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...