Please sign in first.
I - A Certain Game 解説
by
harurun4635
簡単に実装する方法
基本的な発想は公式解説と同様です。マージ過程を表す木は、2分木になることが知られています。
この木をトポロジカルソート順にみればよいです。簡単には「マージを逆順」に見れば、トポロジカルソート順となることがわかるはずです。
よって、適切にマージ過程を管理しておくことで、(グラフを陽に構築せずとも)求めることができます。
実装例では適切にans配列をつかいまわすことで、実装をより簡潔にしています。
実装例(PyPy3)
from atcoder.dsu import DSU
mod = 998244353
n = int(input())
uf = DSU(n)
st = []
for i in range(n - 1):
p, q = map(int, input().split())
p = uf.leader(p - 1)
q = uf.leader(q - 1)
st.append((p, uf.size(p), q, uf.size(q), uf.merge(p, q)))
ans = [0] * n
for i in range(n - 1):
p, sp, q, sq, l = st.pop()
tmp = ans[l]
s = pow(sp+sq, -1, mod)
ans[p] = (tmp + sp * s) % mod
ans[q] = (tmp + sq * s) % mod
print(*ans)
投稿日時:
最終更新: