結果
問題 | No.421 しろくろチョコレート |
ユーザー |
|
提出日時 | 2016-09-09 23:53:17 |
言語 | D (dmd 2.109.1) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,616 bytes |
コンパイル時間 | 1,102 ms |
コンパイル使用メモリ | 124,460 KB |
実行使用メモリ | 6,948 KB |
最終ジャッジ日時 | 2024-06-12 04:16:15 |
合計ジャッジ時間 | 2,944 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 32 WA * 33 |
ソースコード
import std.algorithm, std.array, std.container, std.range, std.bitmanip; import std.numeric, std.math, std.bigint, std.random, core.bitop; import std.string, std.regex, std.conv, std.stdio, std.typecons; class UnionFind { size_t[] par; this(size_t n) { par = new size_t[](n); par[] = size_t.max; } size_t find(size_t i) { if (par[i] == size_t.max) { return i; } else { par[i] = find(par[i]); return par[i]; } } void unite(size_t i, size_t j) { auto pi = find(i), pj = find(j); if (pi != pj) par[pj] = pi; } } void main() { auto rd = readln.split.map!(to!size_t); auto n = rd[0], m = rd[1]; auto sij = iota(n).map!(_ => readln.chomp.map!(c => c != '.').array).array; auto uf = new UnionFind(n * m); foreach (i; 0..n) foreach (j; 0..m) { if (sij[i][j]) { if (i > 0 && sij[i - 1][j]) uf.unite(i * m + j, (i - 1) * m + j); if (i < n - 1 && sij[i + 1][j]) uf.unite(i * m + j, (i + 1) * m + j); if (j > 0 && sij[i][j - 1]) uf.unite(i * m + j, i * m + (j - 1)); if (j < m - 1 && sij[i][j + 1]) uf.unite(i * m + j, i * m + (j + 1)); } } auto s = new int[][](n * m, 2); foreach (i; 0..n) foreach (j; 0..m) if (sij[i][j]) s[uf.find(i * m + j)][(i + j) % 2] += 1; auto r = 0; foreach (i; 0..n * m) { auto a = min(s[i][0], s[i][1]); r += a * 100; s[i][] -= a; } auto l1 = 0, l2 = 0; foreach (i; 0..n * m) { l1 += s[i][0]; l2 += s[i][1]; } auto b = min(l1, l2); r += 10 * b; l1 -= b; l2 -= b; r += l1 + l2; writeln(r); }