Submission #1220971

#TimeUsernameProblemLanguageResultExecution timeMemory
1220971toast12Furniture (JOI20_furniture)C++20
100 / 100
131 ms6784 KiB
#include <bits/stdc++.h> using namespace std; vector<vector<bool>> vacant; vector<int> diag; void block(int i, int j) { if (i == 0 || j == 0 || i == vacant.size()-1 || j == vacant[i].size()-1) return; diag[i+j-1]--; vacant[i][j] = false; // if the cell north-east to this one is also blocked, it makes no sense to keep the one above this and the one to the right of this vacant if (!vacant[i-1][j+1]) { if (vacant[i][j+1]) block(i, j+1); if (vacant[i-1][j]) block(i-1, j); } // similarly, if the cell south-west to this one is also blocked, the one to the left of this one and the one below this one can also be blocked if (!vacant[i+1][j-1]) { if (vacant[i][j-1]) block(i, j-1); if (vacant[i+1][j]) block(i+1, j); } } int main() { ios_base::sync_with_stdio(0); cin.tie(NULL); int n, m; cin >> n >> m; vector<vector<int>> grid(n+2, vector<int>(m+2)); diag.resize(n+m+1); vacant.resize(n+2, vector<bool>(m+2)); for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { cin >> grid[i][j]; diag[i+j-1]++; vacant[i][j] = true; } } for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { if (grid[i][j] && vacant[i][j]) block(i, j); } } int q; cin >> q; while (q--) { int r, c; cin >> r >> c; if (!vacant[r][c]) cout << "1\n"; else if (diag[r+c-1] == 1) cout << "0\n"; else { cout << "1\n"; block(r, c); } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...