Submission #624587

#TimeUsernameProblemLanguageResultExecution timeMemory
624587_Avocado_Portals (BOI14_portals)C++14
100 / 100
255 ms31172 KiB
#include <bits/stdc++.h> //#define int int64_t using namespace std; #pragma GCC target ("avx2") #pragma GCC optimization ("O3") #pragma GCC optimization ("unroll-loops") int n, m; vector<pair<int, int>>delta = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}; struct wall{ int up, down, left, right; }; int check(int i, int j, auto&graph, auto&dist, int op){ if(i < n && i>=0 && j < m && j>=0 && graph[i][j] != '#'){ if(op){ if(dist[i][j] == 1e9) return 1; return 0; } return 1; } return 0; } vector<vector<int>>bfs(auto&graph, auto&start){ queue<pair<int, int>>q; vector<vector<int>>dist(n, vector<int>(m, (int)1e9)); for(auto [x, y]: start){ q.push({x, y}); dist[x][y] = 0; } while(q.size()){ int i = q.front().first; int j = q.front().second; q.pop(); for(auto [x, y]: delta){ if(check(i+x, j+y, graph, dist, 1)){ dist[i+x][j+y] = dist[i][j] + 1; q.push({i+x, j+y}); } } } return dist; } int spfa(auto&next, auto&w, auto&graph, pair<int, int>s, pair<int, int>e){ vector<vector<int>>dist(n, vector<int>(m, 1e9)); queue<pair<int, int>>q; q.push({s.first, s.second}); dist[s.first][s.second] = 0; while(q.size()){ auto [i, j] = q.front(); q.pop(); for(auto [x, y]: delta){ if(check(i+x, j+y, graph, dist, 0) && dist[i][j]+1 < dist[i+x][j+y]){ dist[i+x][j+y] = dist[i][j]+1; q.push({i+x, j+y}); } } int cur = next[i][j]; int nd = dist[i][j]+cur; if(check(w[i][j].up, j, graph, dist, 0) && nd < dist[w[i][j].up][j]){ dist[w[i][j].up][j] = nd; q.push({w[i][j].up, j}); } if(check(w[i][j].down, j, graph, dist, 0) && nd < dist[w[i][j].down][j]){ dist[w[i][j].down][j] = nd; q.push({w[i][j].down, j}); } if(check(i, w[i][j].right, graph, dist, 0) && nd < dist[i][w[i][j].right]){ dist[i][w[i][j].right] = nd; q.push({i, w[i][j].right}); } if(check(i, w[i][j].left, graph, dist, 0) && nd < dist[i][w[i][j].left]){ dist[i][w[i][j].left] = nd; q.push({i, w[i][j].left}); } } return dist[e.first][e.second]; } signed main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); //ifstream cin ("input.in"); //ofstream cout ("output.out"); cin>>n>>m; m += 2; vector<string>graph; string border; for(int i = 0; i<m; ++i) border += '#'; graph.push_back(border); for(int i = 0; i<n; ++i){ string s; cin>>s; graph.push_back("#"); for(auto u: s) graph[i+1] += u; graph[i+1] += '#'; } graph.push_back(border); /* for(auto u: graph){ for(auto v: u) cout<<v; cout<<endl; } cout<<endl; */ n += 2; vector<vector<wall>>w(n, vector<wall>(m)); pair<int, int>s, e; vector<pair<int, int>>start; for(int i = 0; i<n; ++i){ int cur = 0; for(int j = 0; j<m; ++j){ if(graph[i][j] == 'S') s = {i, j}; if(graph[i][j] == 'C') e = {i, j}; if(graph[i][j] == '#'){ cur = j; start.push_back({i, j}); } w[i][j].left = cur+1; } cur = m-1; for(int j = m-1; j>=0; --j){ if(graph[i][j] == '#') cur = j; w[i][j].right = cur-1; } } for(int j = 0; j<m; ++j){ int cur = 0; for(int i = 0; i<n; ++i){ if(graph[i][j] == '#') cur = i; w[i][j].up = cur+1; } cur = n-1; for(int i = n-1; i>=0; --i){ if(graph[i][j] == '#') cur = i; w[i][j].down = cur-1; } } vector<vector<int>>next = bfs(graph, start); /* for(auto u: next){ for(auto v: u) cout<<v<<" "; cout<<endl; } cout<<endl; */ cout<<spfa(next, w, graph, s, e); cout<<'\n'; }

Compilation message (stderr)

portals.cpp:6: warning: ignoring '#pragma GCC optimization' [-Wunknown-pragmas]
    6 | #pragma GCC optimization ("O3")
      | 
portals.cpp:7: warning: ignoring '#pragma GCC optimization' [-Wunknown-pragmas]
    7 | #pragma GCC optimization ("unroll-loops")
      | 
portals.cpp:16:25: warning: use of 'auto' in parameter declaration only available with '-fconcepts-ts'
   16 | int check(int i, int j, auto&graph, auto&dist, int op){
      |                         ^~~~
portals.cpp:16:37: warning: use of 'auto' in parameter declaration only available with '-fconcepts-ts'
   16 | int check(int i, int j, auto&graph, auto&dist, int op){
      |                                     ^~~~
portals.cpp:27:24: warning: use of 'auto' in parameter declaration only available with '-fconcepts-ts'
   27 | vector<vector<int>>bfs(auto&graph, auto&start){
      |                        ^~~~
portals.cpp:27:36: warning: use of 'auto' in parameter declaration only available with '-fconcepts-ts'
   27 | vector<vector<int>>bfs(auto&graph, auto&start){
      |                                    ^~~~
portals.cpp: In function 'std::vector<std::vector<int> > bfs(auto:3&, auto:4&)':
portals.cpp:30:11: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   30 |  for(auto [x, y]: start){
      |           ^
portals.cpp:40:12: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   40 |   for(auto [x, y]: delta){
      |            ^
portals.cpp: At global scope:
portals.cpp:51:10: warning: use of 'auto' in parameter declaration only available with '-fconcepts-ts'
   51 | int spfa(auto&next, auto&w, auto&graph, pair<int, int>s, pair<int, int>e){
      |          ^~~~
portals.cpp:51:21: warning: use of 'auto' in parameter declaration only available with '-fconcepts-ts'
   51 | int spfa(auto&next, auto&w, auto&graph, pair<int, int>s, pair<int, int>e){
      |                     ^~~~
portals.cpp:51:29: warning: use of 'auto' in parameter declaration only available with '-fconcepts-ts'
   51 | int spfa(auto&next, auto&w, auto&graph, pair<int, int>s, pair<int, int>e){
      |                             ^~~~
portals.cpp: In function 'int spfa(auto:5&, auto:6&, auto:7&, std::pair<int, int>, std::pair<int, int>)':
portals.cpp:58:8: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   58 |   auto [i, j] = q.front();
      |        ^
portals.cpp:61:12: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   61 |   for(auto [x, y]: delta){
      |            ^
#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...