제출 #1281922

#제출 시각아이디문제언어결과실행 시간메모리
1281922am_aadvikFurniture (JOI20_furniture)C++20
0 / 100
6 ms572 KiB
#include <iostream> #include <vector> #include <set> using namespace std; void upd(int i, int j, vector<vector<int>>& dp, vector<set<pair<int, int>>>& lvl, vector<vector<int>> &a) { if ((i >= dp.size()) || (j >= dp[0].size())) return; if ((i < 0) || (j < 0)) return; int ov = dp[i][j]; dp[i][j] = dp[i][j + 1] | dp[i + 1][j] & (!a[i][j]); if (ov != dp[i][j]) { upd(i - 1, j, dp, lvl, a), upd(i, j - 1, dp, lvl, a); if (dp[i][j] == 0) lvl[i + j].erase({ i, j }); } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int n, m; cin >> n >> m; vector<vector<int>> a(n, vector<int>(m)); vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0)); for (auto& x : a) for (auto& y : x) cin >> y; dp[n][m - 1] = 1; for (int i = n - 1; i >= 0; --i) for (int j = m - 1; j >= 0; --j) dp[i][j] = (dp[i + 1][j] | dp[i][j + 1]) & (!a[i][j]); vector<set<pair<int, int>>> lvl(n + m); for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) if (dp[i][j]) lvl[i + j].insert({ i, j }); int q; cin >> q; while (q--) { int i, j; cin >> i >> j; --i, --j; if ((lvl[i + j].size() == 1) && ((*lvl[i + j].begin()) == make_pair(i, j))) cout << 0 << endl; else { cout << 1 << endl; dp[i][j] = 0, lvl[i + j].erase({ i, j }); upd(i - 1, j, dp, lvl, a), upd(i, j - 1, dp, lvl, a); } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...