結果
問題 | No.1054 Union add query |
ユーザー | siman |
提出日時 | 2022-04-06 05:51:36 |
言語 | Ruby (3.3.0) |
結果 |
AC
|
実行時間 | 1,217 ms / 2,000 ms |
コード長 | 994 bytes |
コンパイル時間 | 386 ms |
コンパイル使用メモリ | 7,424 KB |
実行使用メモリ | 27,776 KB |
最終ジャッジ日時 | 2024-05-05 17:15:38 |
合計ジャッジ時間 | 11,892 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 74 ms
12,032 KB |
testcase_01 | AC | 77 ms
12,160 KB |
testcase_02 | AC | 82 ms
12,032 KB |
testcase_03 | AC | 1,167 ms
14,848 KB |
testcase_04 | AC | 1,217 ms
27,776 KB |
testcase_05 | AC | 1,077 ms
13,312 KB |
testcase_06 | AC | 1,056 ms
17,920 KB |
testcase_07 | AC | 1,022 ms
17,536 KB |
testcase_08 | AC | 996 ms
17,664 KB |
testcase_09 | AC | 1,133 ms
27,776 KB |
testcase_10 | AC | 867 ms
27,648 KB |
コンパイルメッセージ
Syntax OK
ソースコード
class UnionFind def initialize(n) @size = Array.new(n, 1) @b = Array.new(n, 0) @parent = [] (0..n).each do |i| @parent[i] = i end end def find(x) if @parent[x] == x x else find(@parent[x]) end end def add(x, v) root = find(x) @b[root] += v end def get(x) if @parent[x] == x @b[x] else @b[x] + get(@parent[x]) end end def unite(x, y) x = find(x) y = find(y) return if x == y if @size[x] < @size[y] @parent[x] = y @size[y] += @size[x] @b[x] -= @b[y] else @parent[y] = x @size[x] += @size[y] @b[y] -= @b[x] end end def same?(x, y) find(x) == find(y) end def size(x) @size[find(x)] end end N, Q = gets.split.map(&:to_i) uf = UnionFind.new(N + 1) A = Hash.new(0) Q.times do t, a, b = gets.split.map(&:to_i) case t when 1 uf.unite(a, b) when 2 uf.add(a, b) when 3 puts uf.get(a) end end