Submission #763579

#TimeUsernameProblemLanguageResultExecution timeMemory
763579caganyanmazMaze (JOI23_ho_t3)C++17
100 / 100
980 ms306776 KiB
#include <bits/stdc++.h> #define pb push_back using namespace std; constexpr static int MAX_R = 2500; int r, c, n; vector<int> min_dist[MAX_R]; vector<vector<array<int, 2>>> steps; vector<bool> white[MAX_R]; vector<bool> visited[MAX_R]; vector<bool> seen[MAX_R]; void clean_dfs(int x, int y, int step); void clean_check(int x, int y, int step) { if (c > x && x >= 0 && r > y && y >= 0 && !visited[y][x] && white[y][x]) clean_dfs(x, y, step); } void clean_dfs(int x, int y, int step) { visited[y][x] = true; min_dist[y][x] = step; if (!seen[y][x]) steps[step].pb({x, y}); clean_check(x-1, y, step); clean_check(x+1, y, step); clean_check(x, y-1, step); clean_check(x, y+1, step); } vector<int> bvert[MAX_R]; vector<int> bhrz[MAX_R]; void bfs(int step) { queue<array<int, 2>> vq, hq; for (array<int, 2> pos : steps[step]) vq.push(pos); while (vq.size()) { auto [x, y] = vq.front(); vq.pop(); if (min_dist[y][x] == step) bvert[y][x] = 0; for (int dy = -1; dy <= 1; dy+=2) { if (r > y+dy && y+dy >= 0 && !visited[y+dy][x] && !seen[y+dy][x]) { seen[y+dy][x] = true; min_dist[y+dy][x] = step + 1; steps[step+1].pb({x, y+dy}); bvert[y+dy][x] = bvert[y][x]+1; if (bvert[y+dy][x] < n) vq.push({x, y+dy}); } } } vector<array<int, 2>> lasts; for (array<int, 2> pos : steps[step]) hq.push(pos); for (array<int, 2> pos : steps[step+1]) if (bvert[pos[1]][pos[0]] < n) hq.push(pos); else lasts.push_back(pos); if (n > 1) for (array<int, 2> pos : lasts) hq.push(pos); while (hq.size()) { auto [x, y] = hq.front(); hq.pop(); if (bvert[y][x] != -1 && bvert[y][x] < n) bhrz[y][x] = 0; else if (bvert[y][x] != -1 && bvert[y][x] == n) bhrz[y][x] = 1; for (int dx = -1; dx <= 1; dx+=2) { if (c > x+dx && x+dx >= 0 && !visited[y][x+dx] && !seen[y][x+dx]) { seen[y][x+dx] = true; min_dist[y][x+dx] = step + 1; steps[step+1].pb({x+dx, y}); bhrz[y][x+dx] = bhrz[y][x]+1; if (bhrz[y][x+dx] < n) hq.push({x+dx, y}); } } } } int main() { cin >> r >> c >> n; int sx, sy, ex, ey; cin >> sy >> sx; cin >> ey >> ex; sy--, sx--, ey--, ex--; for (int y = 0; y < r; y++) { string s; white[y] = vector<bool>(c); visited[y] = vector<bool>(c); min_dist[y] = vector<int>(c); bvert[y] = vector<int>(c, -1); bhrz[y] = vector<int>(c, -1); seen[y] = vector<bool>(c, false); cin >> s; for (int x = 0; x < c; x++) white[y][x] = s[x] == '.'; } steps.pb(vector<array<int, 2>>(0)); int current_step = 0; clean_dfs(sx, sy, 0); for (auto [x, y] : steps[current_step]) while (!visited[ey][ex] && !seen[ey][ex]) { steps.pb(vector<array<int, 2>>(0)); bfs(current_step); current_step++; for (int i = steps[current_step].size()-1; i >= 0; i--) { auto [x, y] = steps[current_step][i]; if (!visited[y][x]) clean_dfs(x, y, current_step); } } cout << min_dist[ey][ex] << "\n"; }

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:121:19: warning: structured binding declaration set but not used [-Wunused-but-set-variable]
  121 |         for (auto [x, y] : steps[current_step])
      |                   ^~~~~~
#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...