ABC 219
Table of Contents
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つ目は堀でない領域の連結させたときに壁に接していない領域があるかをチェックすればよい


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