3匹の猫

みみねこの競プロ精進メモ

ACL Beginner Contestの感想

略称はABLらしい。明日から使えるムダ知識をあなたに

100-200-300(1)-0-0-0で1ペナ3完600点。

A - Repeat ACL

ACLという文字列をK回だけ出力する。Kは5パターンしかないのでif文を用いて5通りの分岐を記述すると解ける。また、ループを用いると問題文の処理をそのまま実装できるので楽。

計算量は、O(K)

B - Integer Preference

A以上B以下の範囲をXC以上D以下の範囲をYと呼ぶことにする。

2人が好きな整数が存在するということは、範囲Xと範囲Yが重なっているということ。ここで、①「範囲Xの最大値が範囲Yの最大値より小さい」と仮定すると、範囲Xの最大値が範囲Yの最小値より大きければ重なっていることがわかる(等しくても重なる)。これは入力の数値を用いて表現するとC \le Bで判定できる。もし①の条件を満たしていないならACBDを入れ替えることで同様の判定式で判定できる。

計算量は、O(1)

f:id:mmnkblog:20200926233151p:plain
BよりDの方が大きいことを仮定した場合の範囲の重なり方

C - Connect Cities

都市を頂点、道路を辺と見たグラフを考える。1回の操作により、異なる2つの連結成分*1 を辺でつなぐことができる。初めの状態で連結成分がX個あるなら、この操作をX-1回行えば必ず連結成分が1個になるので、答えはX-1である。

あとは連結成分の個数を数えられれば良い。これにはDFSを用いて全頂点を走査する方法や、UnionFindで頂点集合を管理する方法がある。今回はUnionFindを用いて実装した。

ACLでは、UnionFindという名前ではなく「DSU(Disjoint Set Union)」と呼ばれている。同じ集合に属するならばその集合の代表元も同じなので、setなどを用いて代表元の個数を数える。

計算量は、DFSを用いる方法でO(N)、UnionFindとsetを用いる方法でO(N\log N)

D - Flat Subsequence

ここから解けなかったので簡潔に書く。

DP。単純に書くと遷移にO(N^2)かかってしまうところを、セグ木を使うとO(N\log N)で書ける。

E - Replace Digits

遅延セグ木を使うと(Q\log N)で書ける。

感想

水色なのに茶パフォとってしまったのでしばらく謹慎する

*1:無向グラフにおいて、辺でつながっている頂点のまとまりのこと