제출 #439165

#제출 시각아이디문제언어결과실행 시간메모리
439165elazarkorenT-Covering (eJOI19_covering)C++17
0 / 100
3 ms332 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) #define all(v) v.begin(), v.end() 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; vi special(k); vvb visited(n, vb(m)); int x; for (int i = 0; i < k; i++) { cin >> x >> special[i]; visited[x][special[i]] = true; } // int x = special[0].x; sort(all(special)); int ans = 0; vb put(k); while (true) { bool is_new = false; for (int i = 0; i < k; i++) { if (put[i]) continue; int y = special[i]; int sum = board[x][y], min_val = infinity, bad = 4; if (x) { sum += board[x - 1][y]; bad--; chkmin(min_val, board[x - 1][y]); } if (x < n - 1) { sum += board[x + 1][y]; bad--; chkmin(min_val, board[x + 1][y]); } if (y && !visited[x][y - 1]) { sum += board[x][y - 1]; bad--; chkmin(min_val, board[x][y - 1]); } if (y < m - 1 && !visited[x][y + 1]) { sum += board[x][y + 1]; bad--; chkmin(min_val, board[x][y + 1]); } if (bad == 1) { ans += sum; visited[x][y - 1] = true; visited[x][y + 1] = true; is_new = true; put[i] = true; } else if (bad > 1) { cout << "No"; return 0; } } if (!is_new) break; } vi curr = {0}; for (int i = 1; i < k; i++) { if (!put[i] && special[i - 1] + 2 == special[i]) { curr.push_back(i); continue; } if (curr.empty()) { if (!put[i]) curr.push_back(i); continue; } int sum = 0; int min_val = infinity; for (int j : curr) { int y = special[j]; chkmin(min_val, board[x - 1][y]); chkmin(min_val, board[x + 1][y]); chkmin(min_val, board[x][y - 1]); sum += board[x - 1][y] + board[x + 1][y] + board[x][y - 1] + board[x][y]; } chkmin(min_val, board[x][special[curr.back()] + 1]); sum += board[x][special[curr.back()] + 1]; ans += sum - min_val; curr.clear(); if (!put[i]) curr.push_back(i); } int sum = 0; int min_val = infinity; for (int j : curr) { int y = special[j]; chkmin(min_val, board[x - 1][y]); chkmin(min_val, board[x + 1][y]); chkmin(min_val, board[x][y - 1]); sum += board[x - 1][y] + board[x + 1][y] + board[x][y - 1] + board[x][y]; } chkmin(min_val, board[x][special[curr.back()] + 1]); sum += board[x][special[curr.back()] + 1]; ans += sum - min_val; cout << ans; } //3 7 //7 3 8 1 0 9 10 //4 6 2 5 8 3 10 //1 9 7 3 9 5 10 //3 //1 1 //1 3 //1 5
#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...