Submission #584632

#TimeUsernameProblemLanguageResultExecution timeMemory
584632rainboyMars (APIO22_mars)C++17
100 / 100
1442 ms4716 KiB
#include "mars.h" #include <string.h> #include <stdio.h> using namespace std; typedef vector<string> vs; typedef vector<vs> vvs; const int N = 20, N_ = N * 2 + 1; int find(int *ds, int i) { return ds[i] < 0 ? i : (ds[i] = find(ds, ds[i])); } int join(int *ds, int i, int j) { i = find(ds, i); j = find(ds, j); if (i == j) return 0; if (ds[i] > ds[j]) ds[i] = j; else { if (ds[i] == ds[j]) ds[i]--; ds[j] = i; } return 1; } string process(vvs ss, int i, int j, int k, int n) { int n_ = (k + 1) * 2 + 1, m = (n + 1) / 2, l = (m + 1) / 3; if (n == 1) { int ds[N_ * N_]; memset(ds, -1, n_ * n_ * sizeof *ds); for (i = 0; i < n_; i++) for (j = 0; j < n_; j++) if (ss[i][j][0] == '1') { if (i > 0 && ss[i - 1][j][0] == '1') join(ds, i * n_ + j, (i - 1) * n_ + j); if (j > 0 && ss[i][j - 1][0] == '1') join(ds, i * n_ + j, i * n_ + (j - 1)); } int c = 0; for (i = 0; i < n_ * n_; i++) if (ds[i] < 0 && ss[i / n_][i % n_][0] == '1') c++; string t(100, '0'); for (int h = 0; h < 10; h++) t[h] = (c >> h & 1) + '0'; return t; } else { if (k < l) { string s(100, '0'); for (int i1 = 0; i1 < 3; i1++) for (int j1 = 0; j1 < 3; j1++) for (int i2 = 0; i2 < n_ - 2; i2++) for (int j2 = 0; j2 < n_ - 2; j2++) s[(i1 + i2) * n_ + (j1 + j2)] = ss[i1][j1][i2 * (n_ - 2) + j2]; return s; } else if (k < m - 1) { for (int i1 = 0; i1 < 2; i1++) for (int j1 = 0; j1 < 2; j1++) for (int i2 = 0; i2 < 3; i2++) for (int j2 = 0; j2 < 3; j2++) if (i == i1 * (n - m) * 2 + i2 * (m - 1 - k) && j == j1 * (n - m) * 2 + j2 * (m - 1 - k)) return ss[i2][j2]; return ss[0][0]; } else if (k == m - 1) { int i0, j0; for (i0 = 0; i0 < 2; i0++) for (j0 = 0; j0 < 2; j0++) if (i == i0 * (n - m) * 2 && j == j0 * (n - m) * 2) goto out; out: if (i0 == 2) return ss[0][0]; int m_ = m * 2 + 1, l_ = l * 2 + 1; string s_(m_ * m_, '0'); for (int i1 = 0; i1 < 3; i1++) for (int j1 = 0; j1 < 3; j1++) for (int i2 = 0; i2 < l_; i2++) for (int j2 = 0; j2 < l_; j2++) s_[(i1 * (m - l) + i2) * m_ + (j1 * (m - l) + j2)] = ss[i1][j1][i2 * l_ + j2]; string s((n + 1) * (n + 1), '0'); for (i = 0; i <= n; i++) for (j = 0; j <= n; j++) s[i * (n + 1) + j] = s_[(i + i0 * n % 2) * m_ + (j + j0 * n % 2)]; int ds[(N + 1) * (N + 1)]; memset(ds, -1, (n + 1) * (n + 1) * sizeof *ds); for (i = 0; i <= n; i++) for (j = 0; j <= n; j++) if (s[i * (n + 1) + j] == '1') { if (i > 0 && s[(i - 1) * (n + 1) + j] == '1') join(ds, i * (n + 1) + j, (i - 1) * (n + 1) + j); if (j > 0 && s[i * (n + 1) + (j - 1)] == '1') join(ds, i * (n + 1) + j, i * (n + 1) + (j - 1)); } int rr_[N * 4]; for (i = 0, j = 0; i < n; i++) rr_[i] = find(ds, i * (n + 1) + j); for (i = n, j = 0; j < n; j++) rr_[n + j] = find(ds, i * (n + 1) + j); for (i = n, j = n; i > 0; i--) rr_[n * 3 - i] = find(ds, i * (n + 1) + j); for (i = 0, j = n; j > 0; j--) rr_[n * 4 - j] = find(ds, i * (n + 1) + j); int c = 0; for (i = 0; i < (n + 1) * (n + 1); i++) if (ds[i] < 0 && s[i] == '1') c++; string t(100, '0'); int rr[N_]; if (i0 == 0 && j0 == 0) for (int h = 0; h <= n * 2; h++) rr[h] = rr_[(h + n) % (n * 4)]; else if (i0 == 0 && j0 == 1) for (int h = 0; h <= n * 2; h++) rr[h] = rr_[(h + 0) % (n * 4)]; else if (i0 == 1 && j0 == 1) for (int h = 0; h <= n * 2; h++) rr[h] = rr_[(h + n * 3) % (n * 4)]; else for (int h = 0; h <= n * 2; h++) rr[h] = rr_[(h + n * 2) % (n * 4)]; for (int h = 0; h <= n; h++) if (s[rr[h]] == '0') c++; if (i0 == 0 && j0 == 0 && s[rr[n]] == '0') c--; char used[(N + 1) * (N + 1)]; for (int h = 0; h < 10; h++) t[h] = (c >> h & 1) + '0'; memset(used, 0, sizeof used); for (int h = 0; h <= n * 2; h++) if (!used[rr[h]]) used[rr[h]] = 1, t[10 + (h << 1 | 0)] = '1'; memset(used, 0, sizeof used); for (int h = n * 2; h >= 0; h--) if (!used[rr[h]]) used[rr[h]] = 1, t[10 + (h << 1 | 1)] = '1'; return t; } else if (k < n - 1) { if (i == (n - 1 - k) * 2 && j == 0) return ss[2][0]; else if (i == 0 && j == (n - 1 - k) * 2) return ss[0][2]; if (i == (n - 1 - k) * 2 && j == (n - 1 - k) * 2) return ss[2][2]; return ss[0][0]; } else { int ds[N_ * 4], qu[N_]; int c_, cnt; memset(ds, -1, n_ * 4 * sizeof *ds); c_ = 0; for (int i0 = 0; i0 < 2; i0++) for (int j0 = 0; j0 < 2; j0++) { string t = ss[i0 * 2][j0 * 2]; int g = 0; if (i0 == 0 && j0 == 0) g = 0; else if (i0 == 0 && j0 == 1) g = 1; else if (i0 == 1 && j0 == 1) g = 2; else g = 3; int c = 0; for (int h = 0; h < 10; h++) if (t[h] == '1') c |= 1 << h; c_ += c; cnt = 0; for (int h = 0; h <= n * 2; h++) { if (t[10 + (h << 1 | 0)] == '1') qu[cnt++] = g * n_ + h; else join(ds, qu[cnt - 1], g * n_ + h); if (t[10 + (h << 1 | 1)] == '1') cnt--; } } for (int g = 0; g < 4; g++) for (int h = n; h <= n * 2; h++) if (join(ds, g * n_ + h, (g + 1) % 4 * n_ + n_ - 1 - h)) c_--; string t(100, '0'); for (int h = 0; h < 10; h++) t[h] = (c_ >> h & 1) + '0'; return t; } } }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...