Submission #1281996

#TimeUsernameProblemLanguageResultExecution timeMemory
1281996am_aadvikFurniture (JOI20_furniture)C++20
0 / 100
3 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] = (((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);
}
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)
            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)
            dp2[i][j] = (((i == 0) ? 0 : dp2[i - 1][j]) | (((j == 0) ? 0 : dp2[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 (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...