ABC 219

https://atcoder.jp/contests/abc219

A. AtCoder Quiz 2

https://atcoder.jp/contests/abc219/tasks/abc219_a

B. Maritozzo

https://atcoder.jp/contests/abc219/tasks/abc219_b

C. Neo-lexicographic Ordering

https://atcoder.jp/contests/abc219/tasks/abc219_c

D. Strange Lunchbox

https://atcoder.jp/contests/abc219/tasks/abc219_d

E. Moat

https://atcoder.jp/contests/abc219/tasks/abc219_e

2026/3/1 bit 全探索の問題だということを知った状態で自力 AC

堀で囲まれた領域を全探索する。

公式解説のように以下の2つのような領域が複数ある場合や、内部に壁に接しない領域がある場合は堀が多角形にならないので除く必要がある。

1つ目は連結成分の数をチェック、2つ目は堀でない領域の連結させたときに壁に接していない領域があるかをチェックすればよい

image 1

image 2

void solve() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    ll N = 4;
    vvint A(N, vint(N));
    rep(i, N) rep(j, N) cin >> A[i][j];

    vint di = {0, 1, 0, -1};
    vint dj = {1, 0, -1, 0};

    int ans = 0;
    rep(state, 1ll << N * N) {
        vvint grid(N, vint(N));

        dsu uf(N * N + 1);
        rep(i, N * N) {
            if (state >> i & 1) {
                int r = i / N;
                int c = i % N;
                grid[r][c] = 1;
            }
        }

        int ok = 1;
        rep(r, N) rep(c, N) {
            if (A[r][c] && !grid[r][c]) ok = 0;
        }
        if (!ok) continue;

        rep(r, N) rep(c, N) {
            rep(d, 4) {
                ll nr = r + di[d], nc = c + dj[d];
                if (clamp(nr, 0ll, N - 1) != nr || clamp(nc, 0ll, N - 1) != nc) continue;
                if (grid[nr][nc] == grid[r][c]) {
                    int L = nr * N + nc, R = r * N + c;
                    uf.merge(L, R);
                }
            }
            if (grid[r][c] == 0 && (r == 0 || r == N - 1 || c == 0 || c == N - 1)) {
                uf.merge(r * N + c, N * N);
            }
        }

        // 堀に囲まれた壁に連結していない領域がないかチェック
        rep(r, N) rep(c, N) {
            if (grid[r][c] == 0 && !uf.same(r * N + c, N * N)) ok = 0;
        }
        if (!ok) continue;

        // 堀で囲まれた領域が一つだけであることをチェック
        set<int> ch;
        rep(i, N) rep(j, N) {
            if (grid[i][j]) ch.insert(uf.leader(i * N + j));
        }
        if (ch.size() != 1) continue;
        ans++;
    }
    cout << ans << endl;
}

F. Cleaning Robot

https://atcoder.jp/contests/abc219/tasks/abc219_f

G. Propagation

https://atcoder.jp/contests/abc219/tasks/abc219_g

H. Candles

https://atcoder.jp/contests/abc219/tasks/abc219_h