結果
問題 | No.33 アメーバがたくさん |
ユーザー | siman |
提出日時 | 2022-04-15 02:01:33 |
言語 | Ruby (3.4.1) |
結果 |
AC
|
実行時間 | 88 ms / 5,000 ms |
コード長 | 1,144 bytes |
コンパイル時間 | 108 ms |
コンパイル使用メモリ | 7,552 KB |
実行使用メモリ | 12,416 KB |
最終ジャッジ日時 | 2024-12-24 13:20:19 |
合計ジャッジ時間 | 1,619 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 11 |
コンパイルメッセージ
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).sort 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 && (X[j] - T * D) - (X[i] + T * D) <= D 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