ツバサの備忘録

主に備忘録代わりに精進記録を載せていくつもりです。

ABC120 D - Decayed Bridges

問題
提出コード

解法

全ての橋が崩れた状態では、どの島からも別の島へ行くことができません。
よって、不便さは_{N}C _{2}、すなわち N(N-1)/2となります。
ということで、ここから逆に橋を組み立てていき、不便さを後ろから求めていくことにします。
今現在の不便さがCで、次に(a,b)を繋ぐ橋をかけるとします。
既にaからbへ行くことができる場合、不便さが減ることはないので、aからbへ行くことができない場合を考えていきます。
a自身を含む、aから行くことができる島の個数をA、同様にbから行くことができる島の個数をBとします。
このとき、(a,b)に橋をかけることで、Aに含まれる任意の島から、Bに含まれる任意の島へ、新しくいくことができるようになるため、
不便さはABだけ減ります。
ということで、C-ABが、このときの不便さとなります。
そして、a自身を含み、aから行くことができる島の個数は、A+Bへ増えます。
あとはこれを繰り返し計算していけばよいのですが、このa自身を含み、aから行くことができる島の個数を計算するのに、自分はUnion-Find木を利用しました。
それぞれのグループの根の部分に、根自身を含み、根からいくことができる島の個数を記録しておくことで、高速に計算することができるようになります。
あとは、順番にシミュレーションをしていくことで、この問題のクエリにこたえることができるようになります。

感想

考察自体は結構スムーズに行けたのですが、実装に時間をかけました。ので、自分の中ではもう少しはやく解くことができた、と思っています。ですが、安定して400点問題をはやときできるようになってきている気がするので、うれしいです!