結果
問題 |
No.697 池の数はいくつか
|
ユーザー |
|
提出日時 | 2018-09-27 18:07:20 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 1,564 ms / 6,000 ms |
コード長 | 984 bytes |
コンパイル時間 | 2,212 ms |
コンパイル使用メモリ | 198,980 KB |
最終ジャッジ日時 | 2025-01-06 13:49:22 |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 32 |
ソースコード
#include <bits/stdc++.h> using namespace std; signed main() { ios::sync_with_stdio(false); int N, M; cin >> N >> M; vector<vector<int>> G(N, vector<int>(M)); for (int i = 0; i < N; ++i) for (int j = 0; j < M; ++j) cin >> G[i][j]; vector<int> fa(N * M); iota(fa.begin(), fa.end(), 0); function<int(int)> find = [&](int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }; for (int i = 0; i < N; ++i) for (int j = 0; j < M; ++j) if (G[i][j]) for (int dx = -1; dx < 2; ++dx) for (int dy = -1; dy < 2; ++dy) if (abs(dx) + abs(dy) == 1) { int ni = i + dx; int nj = j + dy; if (ni < 0 || N <= ni || nj < 0 || M <= nj) continue; if (G[ni][nj]) fa[find(ni * M + nj)] = find(i * M + j); } int ans = 0; for (int i = 0; i < N; ++i) for (int j = 0; j < M; ++j) if (G[i][j]) ans += find(i * M + j) == i * M + j; cout << ans << endl; }