結果

問題 No.2563 色ごとのグループ
ユーザー ngng628
提出日時 2023-12-02 15:35:29
言語 Crystal
(1.14.0)
結果
AC  
実行時間 385 ms / 2,000 ms
コード長 2,167 bytes
コンパイル時間 15,782 ms
コンパイル使用メモリ 297,740 KB
実行使用メモリ 79,488 KB
最終ジャッジ日時 2024-09-26 18:57:39
合計ジャッジ時間 19,968 ms
ジャッジサーバーID
(参考情報)
judge2 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 35
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

main = -> {
n, m = read_line.split.map &.to_i64
c = read_line.split.map &.to_i64.pred
sizes = c.tally
graph = Array.new(n) { |color| Array(Array(Int64)).new(sizes[color]? || 0) { [] of Int64 } }
hash = Array.new(n) { Hash(Int64, Int32).new }
m.times do
u, v = read_line.split.map &.to_i64.pred
if c[u] == c[v]
color = c[u]
hash[color][u] = hash[color].size unless hash[color].has_key?(u)
hash[color][v] = hash[color].size unless hash[color].has_key?(v)
u2 = hash[color][u]
v2 = hash[color][v]
graph[color][u2] << v2
graph[color][v2] << u2
end
end
ans = n.times.sum { |color|
next 0_i64 if sizes.fetch(color, 0_i64) == 0
ut = NgLib::DisjointSet.new(sizes.fetch(color, 0_i64))
graph[color].each_with_index do |edges, u|
edges.each do |v|
ut.unite(u, v)
end
end
ut.groups.size - 1
}
puts ans
}
main.call
module NgLib
class DisjointSet
@n : Int32
@parent_or_size : Array(Int32)
def initialize
@n = 0
@parent_or_size = Array(Int32).new
end
def initialize(size : Int)
@n = size.to_i32
@parent_or_size = [-1] * size
end
def unite(a : Int, b : Int) : Int32
x = leader(a)
y = leader(b)
return x if x == y
if -@parent_or_size[x] < -@parent_or_size[y]
x, y = y, x
end
@parent_or_size[x] += @parent_or_size[y]
@parent_or_size[y] = x
x
end
def equiv?(a : Int, b : Int) : Bool
leader(a) == leader(b)
end
def leader(a : Int) : Int32
return a.to_i32 if @parent_or_size[a] < 0
@parent_or_size[a] = leader(@parent_or_size[a])
@parent_or_size[a]
end
def size(a : Int) : Int32
-@parent_or_size[leader(a)]
end
def groups : Array(Array(Int32)) | Nil
leader_buf = [0] * @n
group_size = [0] * @n
@n.times do |i|
leader_buf[i] = leader(i)
group_size[leader_buf[i]] += 1
end
res = Array.new(@n){ [] of Int32 }
@n.times do |i|
res[leader_buf[i]] << i
end
res.delete([] of Int32)
res
end
end
end
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0