Submission #1282120

#TimeUsernameProblemLanguageResultExecution timeMemory
1282120am_aadvikFurniture (JOI20_furniture)C++20
5 / 100
5090 ms1712 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] = (((i == (n - 1))? 0: dp1[i + 1][j]) | (((j == (m - 1)) ? 0 : dp1[i][j + 1]))) & (~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); if (!(dp1[i][j] && dp2[i][j])) if (lvl[i + j].find({ i, j }) != lvl[i + j].end()) lvl[i + j].erase({ i, j }); } 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] = (((i == 0) ? 0 : dp2[i - 1][j]) | (((j == 0) ? 0 : dp2[i][j - 1]))) & (~a[i][j]); if (ov != dp2[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) if((i + j) != (n + m - 2)) dp1[i][j] = (((i == (n - 1)) ? 0 : dp1[i + 1][j]) | (((j == (m - 1)) ? 0 : dp1[i][j + 1]))) & (~a[i][j]); for(int i = 0; i < n; ++i) for(int j = 0; j < m; ++j) if((i + j)) dp2[i][j] = (((i == 0) ? 0 : dp2[i - 1][j]) | (((j == 0) ? 0 : dp2[i][j - 1]))) & (~a[i][j]); auto dp1t = dp1, dp2t = dp2; 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; for (int i = n - 1; i >= 0; --i) for (int j = m - 1; j >= 0; --j) if ((i + j) != (n + m - 2)) dp1t[i][j] = (((i == (n - 1)) ? 0 : dp1t[i + 1][j]) | (((j == (m - 1)) ? 0 : dp1t[i][j + 1]))) & (~a[i][j]); for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) if ((i + j)) dp2t[i][j] = (((i == 0) ? 0 : dp2t[i - 1][j]) | (((j == 0) ? 0 : dp2t[i][j - 1]))) & (~a[i][j]); 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); for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) if (dp1[i][j] != dp1t[i][j]) cout << "IDIOT 1 " << i << " " << j << endl; for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) if (dp2[i][j] != dp2t[i][j]) cout << "IDIOT 2 " << i << " " << j << endl; } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...