Submission #680081

#TimeUsernameProblemLanguageResultExecution timeMemory
680081stevancvFurniture (JOI20_furniture)C++14
100 / 100
725 ms64032 KiB
#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define sp ' '
#define en '\n'
#define smin(a, b) a = min(a, b)
#define smax(a, b) a = max(a, b)
#define sadd(a, b) a = Add(a, b)
#define smul(a, b) a = Mul(a, b)
using namespace std;
const int N = 1e3 + 2;
const int mod = 1e9 + 7;
int n, m;
bool a[N][N], uni[N][N], x[N][N], y[N][N], z[N][N];
set<pair<int, int>> pos[2 * N];
bool Can(int i, int j) {
    if (i == 1 && j == 1) return 1;
    if (i == n && j == m) return 1;
    if (z[i][j] == 0) return 1;
    return (z[i - 1][j] | z[i][j - 1]) & (z[i + 1][j] | z[i][j + 1]);
}
void Dfs(int i, int j) {
    if (i <= 0 || i > n) return;
    if (j <= 0 || j > m) return;
    z[i][j] = 0;
    pos[i + j].erase({i, j});
    if (pos[i + j].size() == 1) {
        int ii = pos[i + j].begin()->first;
        int jj = pos[i + j].begin()->second;
        uni[ii][jj] = 1;
    }
    if (!Can(i - 1, j)) Dfs(i - 1, j);
    if (!Can(i, j - 1)) Dfs(i, j - 1);
    if (!Can(i + 1, j)) Dfs(i + 1, j);
    if (!Can(i, j + 1)) Dfs(i, j + 1);
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            cin >> a[i][j];
            pos[i + j].insert({i, j});
        }
    }
    for (int l = 2; l <= n + m; l++) {
        if (pos[l].size() == 1) {
            int ii = pos[l].begin()->first;
            int jj = pos[l].begin()->second;
            uni[ii][jj] = 1;
        }
    }
    x[1][1] = 1;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            x[i][j] |= x[i - 1][j] | x[i][j - 1];
        }
    }
    y[n][m] = 1;
    for (int i = n; i >= 1; i--) {
        for (int j = m; j >= 1; j--) {
            y[i][j] |= y[i + 1][j] | y[i][j + 1];
        }
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            z[i][j] = x[i][j] & y[i][j];
        }
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            if (a[i][j] == 1) Dfs(i, j);
        }
    }
    int q; cin >> q;
    while (q--) {
        int i, j;
        cin >> i >> j;
        if (uni[i][j] == 1) {
            cout << 0 << en;
        }
        else {
            cout << 1 << en;
            Dfs(i, j);
        }
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...