제출 #1281943

#제출 시각아이디문제언어결과실행 시간메모리
1281943am_aadvikFurniture (JOI20_furniture)C++20
0 / 100
5090 ms568 KiB
#include <iostream> #include <vector> #include <set> using namespace std; void upd1(int i, int j, vector<vector<int>>& dp1, vector<vector<int>>& dp2, vector<set<pair<int, int>>>& lvl, vector<vector<int>> &a, int n, int m) { if ((i >= n) || (j >= m)) return; if ((i < 0) || (j < 0)) return; int ov = dp1[i][j]; dp1[i][j] = (dp1[min(n - 1, i + 1)][j] | dp1[i][min(m - 1, j)]) & (~a[i][j]); if (ov != dp1[i][j]) upd1(i - 1, j, dp1, dp2, lvl, a, n, m), upd1(i, j - 1, dp1, dp2, lvl, a, n, m); } void upd2(int i, int j, vector<vector<int>>& dp1, vector<vector<int>>& dp2, vector<set<pair<int, int>>>& lvl, vector<vector<int>>& a, int n, int m) { if ((i >= n) || (j >= m)) return; if ((i < 0) || (j < 0)) return; int ov = dp2[i][j]; dp2[i][j] = (dp2[max(0, i - 1)][j] | dp2[i][max(0, j - 1)]) & (~a[i][j]); if (ov != dp1[i][j]) upd2(i - 1, j, dp1, dp2, lvl, a, n, m), upd2(i, j - 1, dp1, dp2, lvl, a, n, m); if (!(dp1[i][j] && dp2[i][j])) if (lvl[i + j].find({ i, j }) != lvl[i + j].end()) 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>> dp1(n, vector<int>(m, 0)), dp2(n, vector<int>(m, 0)); for (auto& x : a) for (auto& y : x) cin >> y; dp1[n - 1][m - 1] = dp2[0][0] = 1; for (int i = n - 1; i >= 0; --i) for (int j = m - 1; j >= 0; --j) dp1[i][j] = (dp1[min(n - 1, i + 1)][j] | dp1[i][min(m - 1, j + 1)]) & (~a[i][j]); for(int i = 0; i < n; ++i) for(int j = 0; j < m; ++j) dp2[i][j] = (dp2[max(0, i - 1)][j] | dp2[i][max(0, 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 (dp1[i][j] && dp2[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; dp1[i][j] = dp2[i][j] = 0, a[i][j] = 1; if (lvl[i + j].find({ i, j }) != lvl[i + j].end()) lvl[i + j].erase({ i, j }); upd1(i - 1, j, dp1, dp2, lvl, a, n, m), upd1(i, j - 1, dp1, dp2, lvl, a, n, m); upd2(i + 1, j, dp1, dp2, lvl, a, n, m), upd2(i, j + 1, dp1, dp2, lvl, a, n, m); } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...