제출 #439192

#제출 시각아이디문제언어결과실행 시간메모리
439192elazarkorenT-Covering (eJOI19_covering)C++17
25 / 100
254 ms8228 KiB
#include <iostream> #include <vector> #include <algorithm> #include <set> #define x first #define y second #define chkmin(a, b) a = min(a, b) #define chkmax(a, b) a = max(a, b) using namespace std; typedef long long ll; typedef vector<int> vi; typedef vector<vi> vvi; typedef pair<int, int> pii; typedef vector<pii> vii; typedef vector<bool> vb; typedef vector<vb> vvb; const int infinity = 1e9; int main() { int n, m; cin >> n >> m; vvi board(n, vi(m)); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> board[i][j]; } } int k; cin >> k; vii special(k); vvb visited(n, vb(m)); for (int i = 0; i < k; i++) { cin >> special[i].x >> special[i].y; visited[special[i].x][special[i].y] = true; } int ans = 0; vb finished(k); for (int i = 0; i < k; i++) { int x = special[i].x, y = special[i].y; int sum = board[x][y], min_val = infinity, bad = 4; if (x && !visited[x - 1][y]) { sum += board[x - 1][y]; bad--; // visited[x - 1][y] = true; chkmin(min_val, board[x - 1][y]); } if (x < n - 1 && !visited[x + 1][y]) { sum += board[x + 1][y]; bad--; // visited[x + 1][y] = true; chkmin(min_val, board[x + 1][y]); } if (y && !visited[x][y - 1]) { sum += board[x][y - 1]; bad--; // visited[x][y - 1] = true; chkmin(min_val, board[x][y - 1]); } if (y < m - 1 && !visited[x][y + 1]) { sum += board[x][y + 1]; bad--; // visited[x][y + 1] = true; chkmin(min_val, board[x][y + 1]); } if (bad == 1) { finished[i] = true; ans += sum; } else if (bad > 1) { cout << "No"; return 0; } else { if (!visited[x - 1][y - 1] && !visited[x - 1][y + 1] && !visited[x + 1][y - 1] && !visited[x + 1][y + 1]) { ans += sum - min_val; finished[i] = true; } } } for (int i = 0; i < k; i++) { if (finished[i]) continue; int x = special[i].x, y = special[i].y; for (int j = i + 1; j < k; j++) { if (finished[j]) continue; int x1 = special[j].x, y1 = special[j].y; if (abs(x - x1) > 1 || abs(y - y1) > 1) continue; set<pii> touch; touch.insert({x, y}), touch.insert({x - 1, y}), touch.insert({x + 1, y}), touch.insert({x, y + 1}), touch.insert({x, y - 1}); touch.insert({x1, y1}), touch.insert({x1 - 1, y1}), touch.insert({x1 + 1, y1}), touch.insert({x1, y1 + 1}), touch.insert({x1, y1 - 1}); for (pii p : touch) { ans += board[p.x][p.y]; } } } 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...