Open tipstar0125 opened 7 months ago
愚直に求める場合、各頂点の組み合わせのf(i, j)の総和を求めることになる。 これだと、O(N^2)なのでTLE。
f(i, j)のパターンは、辺の重みのパターンだけしかないから、これを全探索することを考える。
主客転倒:f(i, j)になる組み合わせの数を数えて、総和をとる
f(i, j)となるには、それぞれの頂点につながる辺の重みが、i-j間の辺の重みより小さいときの、各頂点につながっている頂点の数同士をかけた数となる。
辺の重みで昇順に並べて、辺が小さい方からUnionFindでuniteしていく。 既にuniteしている辺の重みが、今からuniteする辺の重みよりも小さい状態を保ちつつ、uniteする前の各頂点につながる頂点の数を数えてあげればよい。
https://atcoder.jp/contests/abc214/tasks/abc214_d