Submission #728675

#TimeUsernameProblemLanguageResultExecution timeMemory
728675vjudge1Mars (APIO22_mars)C++17
54 / 100
1774 ms16064 KiB
#include "mars.h" #include <bits/stdc++.h> using namespace std; vector<pair<int, int>> f[30][30][30]; vector<pair<int, int>> trace[30][30][30]; int g[30][30][30]; int done[30][30][30]; std::string process(std::vector<std::vector<std::string>> a, int i, int j, int k, int n) { k++; auto fill = [&](int x, int y, int z, int a, int b) { f[z][x][y].clear(); if (k == n) trace[z][x][y].clear(); g[z][x][y] = 0; for (int ii = x; ii < x + 3; ii++) { for (int jj = y; jj < y + 3; jj++) { if (x / a != ii / b) continue; if (y / a != jj / b) continue; if (done[z - 1][ii][jj] == 0) { f[z][x][y].emplace_back(ii, jj); if (k == n) trace[z][x][y].insert(trace[z][x][y].end(), trace[z - 1][ii][jj].begin(), trace[z - 1][ii][jj].end()); g[z][x][y] += g[z - 1][ii][jj]; done[z - 1][ii][jj] = 1; } } } }; if (k != n) { memset(done, 0, sizeof done); memset(g, 0, sizeof g); for (int ii = 0; ii <= n * 2; ii++) { for (int jj = 0; jj <= n * 2; jj++) { trace[0][ii][jj] = {{ii, jj}}; g[0][ii][jj] = 1; } } int cur_i = i / (((n - k) * 2) / 3 + 1); int cur_j = j / (((n - k) * 2) / 3 + 1); for (int kk = 1; kk <= k; kk++) { int mm = (n - kk) * 2; int cur_size = mm / 3 + 1; int last_size = (mm + 2) / 3 + 1; for (int ii = cur_i * cur_size; ii <= mm && ii < (cur_i + 1) * cur_size; ii++) { for (int jj = cur_j * cur_size; jj <= mm && jj < (cur_j + 1) * cur_size; jj++) { fill(ii, jj, kk, cur_size, last_size); } } } string s = ""; for (pair<int, int>& p : f[k][i][j]) { int ii = p.first; int jj = p.second; int x = ii - i; int y = jj - j; for (int z = 0; z < g[k - 1][ii][jj]; z++) { s += a[x][y][z]; } } while (s.size() < 100) s += '0'; assert(s.size() == 100); return s; } memset(done, 0, sizeof done); memset(g, 0, sizeof g); for (int ii = 0; ii <= n * 2; ii++) { for (int jj = 0; jj <= n * 2; jj++) { trace[0][ii][jj] = {{ii, jj}}; g[0][ii][jj] = 1; } } for (int kk = 1; kk <= k; kk++) { int mm = (n - kk) * 2; int cur_size = mm / 3 + 1; int last_size = (mm + 2) / 3 + 1; for (int ii = 0; ii <= mm; ii++) { for (int jj = 0; jj <= mm; jj++) { fill(ii, jj, kk, cur_size, last_size); } } } k--; vector<vector<int>> map(n * 2 + 1, vector<int>(n * 2 + 1, 0)); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { for (int z = 0; z < g[k][i][j]; z++) { int ii = trace[k][i][j][z].first; int jj = trace[k][i][j][z].second; map[ii][jj] = a[i][j][z] - '0'; } } } int dr[] = {-1, 0, +1, 0}; int dc[] = {0, -1, 0, +1}; int res = 0; for (int i = 0; i <= n * 2; i++) { for (int j = 0; j <= n * 2; j++) { if (map[i][j] == 1) { res++; queue<pair<int, int>> q; q.emplace(i, j); map[i][j] = 0; while (q.size()) { int ii = q.front().first; int jj = q.front().second; q.pop(); for (int id = 0; id < 4; id++) { int ni = ii + dr[id]; int nj = jj + dc[id]; if (ni < 0 || nj < 0 || ni > n * 2 || nj > n * 2 || map[ni][nj] == 0) continue; q.emplace(ni, nj); map[ni][nj] = 0; } } } } } string s = ""; while (s.size() < 100) s += res % 2 + '0', res /= 2; return s; }
#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...