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)

投稿日時:
最終更新: