Submission #1325369

#TimeUsernameProblemLanguageResultExecution timeMemory
1325369zwezdinvFurniture (JOI20_furniture)C++20
0 / 100
2 ms332 KiB
#include<bits/stdc++.h>

struct DSU {
    std::vector<int> p;
    DSU() = default;
    DSU(int n) : p(n) {
        std::iota(p.begin(), p.end(), 0);
    } 
    int get(int u) {
        while (u != p[u]) u = p[u] = p[p[u]];
        return u;
    }
    bool unite(int u, int v) {
        if ((u = get(u)) == (v = get(v))) return false;
        p[v] = u;
        return true;
    }
};

int main() {
    std::cin.tie(nullptr)->sync_with_stdio(false);

    int n, m;
    std::cin >> n >> m;
    std::vector a(n + 2, std::vector<int>(m + 2));
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            std::cin >> a[i][j];
        }
    }
    for (int i = 0; i < n + 2; ++i) {
        for (int j = 0; j < m + 2; ++j) {
            if (i == 0 || i == n + 1 || j == 0 || j == m + 1) {
                if (i == 0 && j == 0) a[i][j] = 0;
                else if (i == n + 1 && j == m + 1) a[i][j] = 0;
                else a[i][j] = 1;
            }
        }
    }
    n += 2, m += 2;
    DSU dsu(n * m);
    auto unite = [&](int i, int j) {
        for (int dx = -1; dx <= 1; ++dx) {
            for (int dy = -1; dy <= 1; ++dy) {
                int x = i + dx, y = j + dy;
                if (0 <= x && x < n && 0 <= y && y < m && a[x][y]) {
                    dsu.unite(i * m + j, x * m + y);
                }
            }
        }
    };
    for (int i = 1; i + 1 < n; ++i) {
        for (int j = 1; j + 1 < m; ++j) {
            if (a[i][j]) unite(i, j);
        }
    }
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            if (!a[i][j]) continue;
            if (i == 0 || i == n - 1) {
                if (j > 0 && a[i][j - 1]) {
                    dsu.unite(i * m + j, i * m + j - 1);
                }
                if (j + 1 < m && a[i][j]) {
                    dsu.unite(i * m + j, i * m + j + 1);
                }
            }
            if (j == 0 || j == m - 1) {
                if (i > 0 && a[i - 1][j]) {
                    dsu.unite(i * m + j, (i - 1) * m + j);
                }
                if (i + 1 < n && a[i + 1][j]) {
                    dsu.unite(i * m + j, (i + 1) * m + j);
                }
            }
        }
    }
    int q;
    std::cin >> q;
    while (q--) {
        int i, j;
        std::cin >> i >> j;
        bool c1 = false, c2 = false;
        for (int dx = -1; dx <= 1; ++dx) {
            for (int dy = -1; dy <= 1; ++dy) {
                int x = i + dx, y = j + dy;
                if (0 <= x && x < n && 0 <= y && y < m && a[x][y]) {
                    c1 |= dsu.get(x * m + y) == dsu.get((n - 1) * m);
                    c2 |= dsu.get(x * m + y) == dsu.get(m - 1);
                }
            }
        }
        if (c1 && c2) std::cout << "0\n";
        else {
            std::cout << "1\n";
            a[i][j] = 1;
            unite(i, j);
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...