Submission #1281729

#TimeUsernameProblemLanguageResultExecution timeMemory
1281729tunademayoMaze (JOI23_ho_t3)C++20
100 / 100
981 ms239228 KiB
#include<bits/stdc++.h> using namespace std; #define ll long long #define _y1 y1 const bool Multitest = 0; const int N = 6e6 + 10; int n, m, r; int dx[4] = {0, 1, 0, -1}; int dy[4] = {1, 0, -1, 0}; int a[N], d[N], dp[N]; int f[N]; int d2[N]; bitset<N> vis; struct Data { int x, y, val; Data() { } Data(int _x, int _y, int _val) : x(_x), y(_y), val(_val) { } }; deque<Data> q; int id(int i, int j) { return (i - 1) * m + j; } int find(int i, int u) { if(d[id(i, u)] == u) return u; int v = find(i, d[id(i, u)]); d[id(i, u)] = v; return v; } void merge(int i, int u, int v) { u = find(i, u), v = find(i, v); d[id(i, u)] = v; } int find2(int i, int u) { if(d2[id(i, u)] == i) return i; int v = find2(d2[id(i, u)], u); d2[id(i, u)] = v; return v; } void merge2(int u, int v, int i) { u = find2(u, i), v = find2(v, i); d2[id(u, i)] = v; } void update(int i, int j, int l, int r, int val) { if(i == j) { if(i <= 0 || i > n) return; } i = max(1, i); j = min(j, n); l = max(1, l); r = min(r, m); //cerr << i << ' ' << j << ' ' << l << ' ' << r << '\n'; int I = find2(i, l); while(I <= j) { //cerr << I << ' ' << l << ' ' << r << '\n'; int fi = find(I, l); while(fi <= r) { if(dp[id(I, fi)] == -1) { q.push_back(Data(I, fi, val)); } if(fi == m) break; merge(I, fi, fi + 1); fi = find(I, fi); } if(I == n) return; if(i != j) { merge2(I, I + 1, l); I = find2(I, l); } else return; } } void work() { cin >> n >> m >> r; int x1, x2, y1, y2; cin >> x1 >> y1 >> x2 >> y2; for(int i = 1 ; i <= n ; i++) { for(int j = 1 ; j <= m ; j++) { d[id(i, j)] = j; d2[id(i, j)] = i; } } for(int i = 1 ; i <= n ; i++) { for(int j = 1 ; j <= m ; j++) { char c; cin >> c; if(c == '.') a[id(i, j)] = 1; } } q.push_back(Data(x1, y1, 0)); vis[id(x1, y1)] = 1; memset(dp, -1, sizeof dp); while(!q.empty()) { Data u = q.front(); q.pop_front(); if(u.y != m) merge(u.x, u.y, u.y + 1); if(dp[id(u.x, u.y)] != -1) continue; dp[id(u.x, u.y)] = u.val; // bfs -> 0 for(int i = 0 ; i < 4 ; i++) { int x = u.x + dx[i]; int y = u.y + dy[i]; if(1 <= x && x <= n) { if(1 <= y && y <= m) { if(vis[id(x, y)] == 1) continue; if(a[id(x, y)] == 0) continue; q.push_front(Data(x, y, u.val)); vis[id(x, y)] = 1; } } } // bfs 1 int x = u.x, y = u.y; update(x - r, x - r, y - r + 1, y + r - 1, u.val + 1); //cerr << "Done b1"; update(x - r + 1, x + r -1 , y - r, y + r, u.val + 1); //cerr << "Done b2"; update(x + r, x + r, y - r + 1, y + r - 1, u.val + 1); //cerr << "Done b3"; } cout << dp[id(x2, y2)]; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int q = 1; if(fopen("task.inp", "r")) { freopen("task.inp", "r", stdin); freopen("task.out", "w", stdout); } if(Multitest) cin >> q; while(q--) work(); }

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:197:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  197 |         freopen("task.inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:198:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  198 |         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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...