CPSCO Session2-G:MSTX

クラスカル法あたりの考え方をちゃんとわかっているかを問われている気がしてよかった。

問題

G - MSTX

考察・解法

 最小全域木だしクラスカル法っぽく考えたい。まずa_i = 0のとき、つまりc=1の辺から優先的に使うことを考えてみる。このとき、もしc=0の辺を使うことがあるとしたら、そのような辺はxがどのような値でも最小全域木に必ず用いられる辺であることが言える。このような辺の集合をmustとする。mustに属する辺はあらかじめ繋いでおいたグラフから初めて、その他の辺の使い方がxの値によってどう変わるかを観察しよう。
 x=a_iのとき、重みがa_i以下であるc=0の辺を最小全域木に用いるかをクラスカル法で判定する。そして、そのような辺がなくなった後のグラフの連結成分の数をs_iとすると、x=a_iのときに最小全域木に使われるc=1の辺の本数はs_i-1本であることがわかる。なぜなら、ここからクラスカル法によってc=1の辺をチェックした後に繋がれる可能性のある辺はmustに属する辺だけで、これらはあらかじめ繋いでおくことにしたからである。
 a_iを昇順にsortしておけば、これを素直にシミュレーションすることができ、時間計算量O(M\log{M} + Q\log{Q})ですべてのクエリに解答できる。

実装

Submission #6249727 - CPSCO2019 Session2
クラスカル法を2回回すのがやや面倒?