제출 #653176

#제출 시각아이디문제언어결과실행 시간메모리
653176ilia_rrT-Covering (eJOI19_covering)C++14
0 / 100
2 ms724 KiB
// بِسْمِ اللَّهِ الرَّحْمَنِ الرَّحِيمِ // Written by Ilia Rahbar // #pragma GCC optimize ("O3,no-stack-protector,unroll-loops,fast-math") // #pragma GCC target ("abm,bmi,bmi2,tbm,avx2") #include <bits/stdc++.h> using namespace std; #define int int64_t #define ai(x) array <int, x> #define F first #define S second const int MOD = 1e9 + 7, N = 1e6 + 100; int ans, n, m, x, k, y, ce, cv, mx, my, mv; ai(2) h1[4] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}, h2[4] = {{1, 1}, {-1, -1}, {-1, 1}, {1, -1}}, h3[4] = {{0, 2}, {0, -2}, {2, 0}, {-2, 0}}; ai(2) hh1[2] = {{0, 1}, {1, 0}}, hh2[2] = {{1, 1}, {1, -1}}, hh3[2] = {{0, 2}, {2, 0}}, hy3[2] = {{0, 2}, {0, -2}}, hx3[2] = {{2, 0}, {-2, 0}}; void no() { cout << "No"; exit(0); } inline bool ex(int x, int y) { return (-1 < x && x < m && -1 < y && y < n); } void add(int x, int y, int **g) { for (auto d : h1) { if (ex(x + d[0], y + d[1]) && !g[x + d[0]][y + d[1]]) { g[x + d[0]][y + d[1]] = 2; } } if (g[x][y] == 3) no(); g[x][y] = 3; } void dfs(int x, int y, int **g, int **c) { add(x, y, g); for (auto d : h1) { if (ex(x + d[0], y + d[1]) && c[x + d[0]][y + d[1]] < m) { m = c[x + d[0]][y + d[1]]; mx = x + d[0]; my = y = d[1]; } } cv++; for (auto d : h3) { if (ex(x + d[0], y + d[1]) && g[x + d[0]][y + d[1]] == 1) { ce++; dfs(x + d[0], y + d[1], g, c); } else if (ex(x + d[0], y + d[1]) && g[x + d[0]][y + d[1]] == 3) ce++; } } int32_t main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> m >> n; int **g, **c; g = new int *[m]; c = new int *[m]; for (int i = 0; i < m; i++) { g[i] = new int [n]; c[i] = new int [n]; } for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) cin >> c[i][j]; cin >> k; for (int i = 0; i < k; i++) { cin >> x >> y; g[x][y] = 1; } if (n < 2 || m < 2 || g[0][0] || g[0][n-1] || g[m-1][0] || g[m-1][n-1]) no(); for (int j = 0; j < n; j++) { if (g[0][j] != 1) continue; add(0, j, g); for (auto d : h1) if (ex(d[0], j + d[1]) && g[d[0]][j + d[1]] == 1) no(); for (auto d : h2) if (ex(d[0], j + d[1]) && g[d[0]][j + d[1]] == 1) no(); for (auto d : hy3) if (ex(d[0], j + d[1]) && g[d[0]][j + d[1]] == 1) no(); } for (int j = 0; j < n; j++) { if (g[m - 1][j] != 1) continue; add(m-1, j, g); for (auto d : h1) if (ex(m - 1 + d[0], j + d[1]) && g[m - 1 + d[0]][j + d[1]] == 1) no(); for (auto d : h2) if (ex(m - 1 + d[0], j + d[1]) && g[m - 1 + d[0]][j + d[1]] == 1) no(); for (auto d : hy3) if (ex(m - 1 + d[0], j + d[1]) && g[m - 1 + d[0]][j + d[1]] == 1) no(); } for (int i = 0; i < m; i++) { if (g[i][0] != 1) continue; add(i, 0, g); for (auto d : h1) if (ex(d[0] + i, d[1]) && g[d[0] + i][d[1]] == 1) no(); for (auto d : h2) if (ex(d[0] + i, d[1]) && g[d[0] + i][d[1]] == 1) no(); for (auto d : hx3) if (ex(d[0] + i, d[1]) && g[d[0] + i][d[1]] == 1) no(); } for (int i = 0; i < m; i++) { if (g[i][n - 1] != 1) continue; add(i, n-1, g); for (auto d : h1) if (ex(d[0] + i, d[1] + n - 1) && g[d[0] + i][d[1] + n - 1] == 1) no(); for (auto d : h2) if (ex(d[0] + i, d[1] + n - 1) && g[d[0] + i][d[1] + n - 1] == 1) no(); for (auto d : hx3) if (ex(d[0] + i, d[1] + n - 1) && g[d[0] + i][d[1] + n - 1] == 1) no(); } for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (g[i][j] != 1) continue; for (auto d : hh1) if (ex(i + d[0], j + d[1]) && g[i + d[0]][j + d[1]] == 1) { add(i, j, g); add(i + d[0], j + d[1], g); } for (auto d : hh2) if (ex(i + d[0], j + d[1]) && g[i + d[0]][j + d[1]] == 1) { add(i, j, g); add(i + d[0], j + d[1], g); } } } for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (g[i][j] != 1) continue; for (auto d : h1) if (ex(i + d[0], j + d[1]) && g[i + d[0]][j + d[1]] == 3) no(); for (auto d : h2) if (ex(i + d[0], j + d[1]) && g[i + d[0]][j + d[1]] == 3) no(); } } queue <ai(2)> q; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (g[i][j] != 1) continue; for (auto d : h1) { if (ex(i + d[0], j + d[1]) && g[i + d[0]][j + d[1]] == 2) { q.push({i, j}); break; } } } } while (q.size()) { x = q.front()[0]; y = q.front()[1]; q.pop(); add(x, y, g); for (auto d : h1) { if (ex(x + d[0], y + d[1])) { for (auto dd : h1) { if (ex(x + d[0] + dd[0], y + d[1] + dd[1]) && g[x + d[0] + dd[0]][y + d[1] + dd[1]] == 1) q.push({x + d[0] + dd[0], y + d[1] + dd[1]}); } } } } for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (g[i][j] == 1) { ce = cv = 0; mx = my = mv = 1e9; dfs(i, j, g, c); ce /= 2; if (ce == cv - 1) g[mx][my] = 0; if (ce > cv) no(); } } } for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) ans += (g[i][j] ? c[i][j] : 0); cout << ans; }
#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...