Submission #1192780

#TimeUsernameProblemLanguageResultExecution timeMemory
1192780woohyun_jngVirus Experiment (JOI19_virus)C++20
100 / 100
355 ms40816 KiB
#include <bits/stdc++.h> #define int long long using namespace std; typedef array<int, 2> pr; const int MAX = 801; int U[MAX][MAX], V[1 << 4]; bool chk[MAX][MAX], vst[MAX][MAX]; pr go[4] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; int dir_n(char C) { return C == 'N' ? 0 : C == 'S' ? 1 : C == 'W' ? 2 : 3; } signed main() { ios_base::sync_with_stdio(false); cin.tie(0), cout.tie(0); int M, R, C, A, B, X, Y, Z, K, ans = MAX * MAX, ans_cnt = 0; bool flag; pr P; vector<pr> arr, his; queue<pr> q; string D; cin >> M >> R >> C >> D; D = D + D; for (int i = 1; i <= R; i++) for (int j = 1; j <= C; j++) cin >> U[i][j]; for (int i = 0; i < (1 << 4); i++) { X = 0; for (char c : D) X = (i & (1 << dir_n(c))) ? X + 1 : 0, V[i] = max(V[i], X); if (V[i] == 2 * M) V[i] = MAX * MAX; } for (int i = 1; i <= R; i++) for (int j = 1; j <= C; j++) if (U[i][j] > 0) arr.push_back({i, j}); random_shuffle(arr.begin(), arr.end()); for (pr i : arr) { q.push(i), chk[i[0]][i[1]] = true, his.push_back(i), Z = 0; while (!q.empty()) { X = q.front()[0], Y = q.front()[1], q.pop(), Z++; flag = false; for (pr j : go) { A = X + j[0], B = Y + j[1], K = 0; if (A < 1 || A > R || B < 1 || B > C || chk[A][B] || U[A][B] == 0) continue; for (int k = 0; k < 4; k++) if (A + go[k][0] >= 1 && A + go[k][0] <= R && B + go[k][1] >= 1 && B + go[k][1] <= C) K |= (chk[A + go[k][0]][B + go[k][1]] ? 1 : 0) << k; if (V[K] < U[A][B]) continue; flag |= vst[A][B], chk[A][B] = true, his.push_back({A, B}), q.push({A, B}); } if (flag) break; } if (!flag) { if (Z < ans) ans = Z, ans_cnt = 1; else if (Z == ans) ans_cnt++; } vst[i[0]][i[1]] = true; for (pr j : his) chk[j[0]][j[1]] = false; his.clear(); while (!q.empty()) q.pop(); } cout << ans << '\n' << ans_cnt * ans << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...