Submission #69669891


Source Code Expand

#include <bits/stdc++.h>
#include <atcoder/all>

using namespace std;
using namespace atcoder;
using ll = long long;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);

  int H, W; cin >> H >> W;
  vector<string> S(H); for(int i=0; i<H; i++) cin >> S[i];

  const int N = H*W;
  auto id = [&](int i, int j){ return i * W + j; };
  auto inside = [&](int i, int j){ return 0<= i&& i<H && 0<=j && j<W; };
  const int di[4] = {-1, 1, 0, 0};
  const int dj[4] = { 0, 0,-1, 1};

  vector<char> black(N, 0);
  vector<int> deg(N, 0);
  ll ans = 0;

  /// 初期黒を集める
  vector<int> initBlack;
  for (int i=0; i<H; i++) {
    for (int j=0; j<W; j++) {
      if (S[i][j] == '#') {
        int v = id(i, j);
        black[v] = 1;
        ans++;
        initBlack.push_back(v);
      }
    }
  }
  // 初期黒から隣接白の黒隣接数を数える
  for (int v : initBlack) {
    int i = v/W, j = v%W;
    for (int d=0; d<4; d++) {
      int ni = i+di[d], nj = j+dj[d];
      if (!inside(ni, nj)) continue;
      int u = id(ni, nj);
      if (!black[u]) deg[u]++;
    }
  }

  // 黒化する集合
  vector<int> cur;
  for (int v=0; v<N; v++) {
    if (!black[v] && deg[v] == 1) {
      black[v] = 1;
      ans++;
      cur.push_back(v);
    }
  }

  vector<int> touched;
  vector<char> mark(N, 0);

  // 黒になる候補がなくなったら終了
  while (!cur.empty()) {
    // 今、黒になった頂点から、白隣接の deg をまとめて更新
    touched.clear();
    for (int v : cur) {
      int i = v/W, j = v%W;
      for (int d=0; d<4; d++) {
        int ni = i+di[d], nj = j+dj[d];
        if (!inside(ni, nj)) continue;
        int u = id(ni, nj);
        if (!black[u]) {
          deg[u]++;
          if (!mark[u]) { 
            mark[u] = 1; 
            touched.push_back(u); 
          }
        }
      }
    }
    // 次で黒化する集合をまとめて決定
    vector<int> next; next.reserve(touched.size());
    for (int u : touched) {
      if (!black[u] && deg[u] == 1) {
        black[u] = 1;
        ans++;
        next.push_back(u);
      }
      mark[u] = 0; // フラグを戻す
    }
    cur.swap(next);
  }

  cout << ans << '\n';
  return 0;
}

Submission Info

Submission Time
Task D - Ulam-Warburton Automaton
User tkar821
Language C++ 23 (gcc 12.2)
Score 425
Code Size 2295 Byte
Status AC
Exec Time 11 ms
Memory 8156 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 425 / 425
Status
AC × 3
AC × 40
Set Name Test Cases
Sample 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt
All 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 01_test_00.txt, 01_test_01.txt, 01_test_02.txt, 01_test_03.txt, 01_test_04.txt, 01_test_05.txt, 01_test_06.txt, 01_test_07.txt, 01_test_08.txt, 01_test_09.txt, 01_test_10.txt, 01_test_11.txt, 01_test_12.txt, 01_test_13.txt, 01_test_14.txt, 01_test_15.txt, 01_test_16.txt, 01_test_17.txt, 01_test_18.txt, 01_test_19.txt, 01_test_20.txt, 01_test_21.txt, 01_test_22.txt, 01_test_23.txt, 01_test_24.txt, 01_test_25.txt, 01_test_26.txt, 01_test_27.txt, 01_test_28.txt, 01_test_29.txt, 01_test_30.txt, 01_test_31.txt, 01_test_32.txt, 01_test_33.txt, 01_test_34.txt, 01_test_35.txt, 01_test_36.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 1 ms 3556 KiB
00_sample_01.txt AC 1 ms 3552 KiB
00_sample_02.txt AC 1 ms 3564 KiB
01_test_00.txt AC 9 ms 6136 KiB
01_test_01.txt AC 4 ms 4316 KiB
01_test_02.txt AC 5 ms 4600 KiB
01_test_03.txt AC 8 ms 5560 KiB
01_test_04.txt AC 9 ms 6248 KiB
01_test_05.txt AC 10 ms 6304 KiB
01_test_06.txt AC 11 ms 6560 KiB
01_test_07.txt AC 10 ms 6256 KiB
01_test_08.txt AC 11 ms 6576 KiB
01_test_09.txt AC 11 ms 6848 KiB
01_test_10.txt AC 5 ms 5416 KiB
01_test_11.txt AC 6 ms 5416 KiB
01_test_12.txt AC 6 ms 5488 KiB
01_test_13.txt AC 6 ms 5468 KiB
01_test_14.txt AC 6 ms 5700 KiB
01_test_15.txt AC 7 ms 5516 KiB
01_test_16.txt AC 7 ms 5872 KiB
01_test_17.txt AC 8 ms 5832 KiB
01_test_18.txt AC 9 ms 6240 KiB
01_test_19.txt AC 10 ms 6208 KiB
01_test_20.txt AC 6 ms 5268 KiB
01_test_21.txt AC 5 ms 5328 KiB
01_test_22.txt AC 5 ms 5244 KiB
01_test_23.txt AC 5 ms 5224 KiB
01_test_24.txt AC 5 ms 5268 KiB
01_test_25.txt AC 6 ms 5480 KiB
01_test_26.txt AC 6 ms 5460 KiB
01_test_27.txt AC 7 ms 5852 KiB
01_test_28.txt AC 7 ms 6084 KiB
01_test_29.txt AC 9 ms 8156 KiB
01_test_30.txt AC 7 ms 6524 KiB
01_test_31.txt AC 7 ms 6420 KiB
01_test_32.txt AC 8 ms 6800 KiB
01_test_33.txt AC 7 ms 6640 KiB
01_test_34.txt AC 7 ms 6444 KiB
01_test_35.txt AC 8 ms 6680 KiB
01_test_36.txt AC 7 ms 5168 KiB