結果
問題 | No.33 アメーバがたくさん |
ユーザー | siman |
提出日時 | 2022-04-15 01:56:02 |
言語 | Ruby (3.3.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,116 bytes |
コンパイル時間 | 190 ms |
コンパイル使用メモリ | 7,296 KB |
実行使用メモリ | 12,288 KB |
最終ジャッジ日時 | 2024-06-06 19:40:17 |
合計ジャッジ時間 | 1,690 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 88 ms
12,160 KB |
testcase_01 | AC | 84 ms
12,032 KB |
testcase_02 | AC | 79 ms
12,032 KB |
testcase_03 | WA | - |
testcase_04 | WA | - |
testcase_05 | WA | - |
testcase_06 | WA | - |
testcase_07 | AC | 81 ms
12,160 KB |
testcase_08 | AC | 82 ms
12,160 KB |
testcase_09 | WA | - |
testcase_10 | AC | 84 ms
12,160 KB |
コンパイルメッセージ
Syntax OK
ソースコード
class UnionFind def initialize(n) @size = Array.new(n, 1) @rank = Array.new(n, 0) @parent = [] (0..n).each do |i| @parent[i] = i end end def find(x) if @parent[x] == x x else @parent[x] = find(@parent[x]) end end def unite(x, y) x = find(x) y = find(y) return if x == y if @rank[x] < @rank[y] @parent[x] = y @size[y] += @size[x] else @parent[y] = x @size[x] += @size[y] @rank[x] += 1 if @rank[x] == @rank[y] end end def same?(x, y) find(x) == find(y) end def size(x) @size[find(x)] end end N, D, T = gets.split.map(&:to_i) X = gets.split.map(&:to_i) uf = UnionFind.new(N) 0.upto(N - 2) do |i| (i + 1).upto(N - 1) do |j| dist = (X[i] - X[j]).abs if dist % D == 0 && dist / D <= T uf.unite(i, j) end end end pairs = Hash.new { |h, k| h[k] = [] } N.times do |i| pa = uf.find(i) pairs[pa] << i end ans = 0 pairs.each do |_, ids| min, max = ids.map { |id| X[id] }.minmax cnt = ((max + T * D) - (min - T * D)) / D + 1 ans += cnt end puts ans