Submission #1205343

#TimeUsernameProblemLanguageResultExecution timeMemory
1205343I_am_Polish_GirlMaze (JOI23_ho_t3)C++20
0 / 100
1 ms320 KiB
#pragma target("arch=icelake-server") #include <iostream> #include <vector> #include <algorithm> #include <map> #include <set> #include <unordered_map> #include <unordered_set> #include <stack> #include <queue> #include <cmath> #include <random> #include <chrono> #include <iomanip> #include <bitset> using namespace std; typedef long long ll; typedef long double ld; int log_ = 12; int inf = 1000000007; long long mod = 998244353; int p = 499; int NADIYA = 39; int n, m; vector <pair <int, int>> go = { {0 , 1} , {0 , -1} , {1 , 0} , {-1 , 0} }; vector <vector <int>> deep; vector <vector <bool>> t; bool checer(int i, int j) { if ((i < 0) or (j < 0)) return false; if ((i >= n) or (j >= m)) return false; return true; } queue<pair <int, int>> q1; queue<pair <int, int>> q2; vector <set <int>> vs_n; vector <set <int>> vs_m; void dfs(int i, int j) { vs_n[i].erase(j); vs_m[j].erase(i); for (int k = 0; k < 4; k++) { int i_ = i + go[k].first; int j_ = j + go[k].second; if (checer(i_, j_) == true) { if ((deep[i_][j_] == inf) and (t[i_][j_] == 0)) { deep[i_][j_] = deep[i][j]; q1.push({ i_, j_ }); dfs(i_, j_); continue; } } } } vector <vector <int>> t2; int k; void dfs2(int i, int j) { t2[i][j] = 1; for (int K = 0; K < 4; K++) { int i_ = i + go[K].first; int j_ = j + go[K].second; if (checer(i_, j_) == true) { if ((deep[i_][j_] == deep[i][j]) and (t2[i_][j_] == 0)) { dfs2(i_, j_); if (abs(j_ - j) == 1) { int P = (j_ - j) * k; int j__ = j_ + P; if ((j__ < m) and (j__ >= 0)) { int mn_ = i_ - k + 1; int mx_ = i_ + k - 1; mn_ = max(mn_, 0); mx_ = min(mx_, n - 1); while (*vs_m[j__].lower_bound(mn_) <= mx_) { int i__ = *vs_m[j__].lower_bound(mn_); deep[i__][j__] = deep[i][j] + 1; q2.push({ i__, j__ }); vs_m[j__].erase(i__); vs_n[i__].erase(j__); } } P /= k; P *= k - 1; int i2 = i_ - k; int j2 = j_ + P; if ((checer(i2, j2) == true) and (vs_n[i2].count(j2) > 0)) { vs_n[i2].erase(j2); vs_m[j2].erase(i2); deep[i2][j2] = deep[i][j] + 1; q2.push({ i2 , j2 }); } i2 = i_ + k; j2 = j_ + P; if ((checer(i2, j2) == true) and (vs_n[i2].count(j2) > 0)) { vs_n[i2].erase(j2); vs_m[j2].erase(i2); deep[i2][j2] = deep[i][j] + 1; q2.push({ i2 , j2 }); } } if (abs(i_ - i) == 1) { int P = (i_ - i) * k; int i__ = i_ + P; if ((i__ < n) and (i__ >= 0)) { int mn_ = j_ - k + 1; int mx_ = j_ + k - 1; mn_ = max(mn_, 0); mx_ = min(mx_, m - 1); while (*vs_n[i__].lower_bound(mn_) <= mx_) { int j__ = *vs_n[i__].lower_bound(mn_); deep[i__][j__] = deep[i][j] + 1; q2.push({ i__, j__ }); vs_m[j__].erase(i__); vs_n[i__].erase(j__); } } P /= k; P *= k - 1; int j2 = j_ - k; int i2 = i_ + P; if ((checer(i2, j2) == true) and (vs_n[i2].count(j2) > 0)) { vs_n[i2].erase(j2); vs_m[j2].erase(i2); deep[i2][j2] = deep[i][j] + 1; q2.push({ i2 , j2 }); } j2 = j_ + k; i2 = i_ + P; if ((checer(i2, j2) == true) and (vs_n[i2].count(j2) > 0)) { vs_n[i2].erase(j2); vs_m[j2].erase(i2); deep[i2][j2] = deep[i][j] + 1; q2.push({ i2 , j2 }); } } } } } } signed main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cin >> n >> m >> k; int i_st, j_st; cin >> i_st >> j_st; i_st--; j_st--; int i_fi, j_fi; cin >> i_fi >> j_fi; i_fi--; j_fi--; t.resize(n); for (int i = 0; i < n; i++) { t[i].resize(m); string s; cin >> s; for (int j = 0; j < m; j++) { if (s[j] == '.') t[i][j] = 0; else t[i][j] = 1; } } vs_n.resize(n); vs_m.resize(m); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { vs_n[i].insert(j); vs_m[j].insert(i); } } for (int i = 0; i < n; i++) { vs_n[i].insert(-1); vs_n[i].insert(m); } for (int j = 0; j < m; j++) { vs_m[j].insert(-1); vs_m[j].insert(n); } deep.resize(n); for (int i = 0; i < n; i++) { deep[i].resize(m, inf); } deep[i_st][j_st] = 0; vs_n[i_st].erase(j_st); vs_m[j_st].erase(i_st); q1.push({ i_st , j_st }); t2.resize(n); for (int i = 0; i < n; i++) { t2[i].resize(m); } for (int d = 0; d < n * m; d++) { int d__ = inf; int i_ = -1; int j_ = -1; while (q1.size() > 0) { int i = q1.front().first; int j = q1.front().second; vs_n[i].erase(j); vs_m[j].erase(i); q1.pop(); if (d__ > abs(i - i_fi) + abs(j - j_fi)) { d__ = abs(i - i_fi) + abs(j - j_fi); i_ = i; j_ = j; } dfs(i, j); } dfs2(i_, j_); swap(q1, q2); } int ans = inf; for (int K = 0; K < 4; K++) { int i = i_fi + go[K].first; int j = j_fi + go[K].second; if (checer(i, j)) { ans = min(ans, deep[i][j]); } } cout << min(ans ,deep[i_fi][j_fi]); } /* 7 1 1 1 1 7 1 . # . # # # . */
#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...