AtCoder Beginner Contest 252 参加記録
コンテスト中AC: A〜F
C - Slot Strategy
解法は公式解説と同じだったので、実装例だけ書いておきます。
の左から番目に文字があるとして、を配列に記録しておきます。これを、
とします。
これを昇順ソートして、ランレングス圧縮すると、文字が何番目に何個出現するかという組が得られるので、あとは公式解説の方法で計算できます。
Submission #31861075 - AtCoder Beginner Contest 252
D - Distinct Trio
"3つがすべて異なる"は、"2つ以上同じものが存在することの補集合"と捉えられます。
そこで、各整数について、ちょうど2個同じ場合とちょうど3個同じ場合の総和を求め、3つを選ぶ総数から引くことにします。
なお、重複なく選ぶことを前提とします。
では、その求め方です。
ここで、を整数の出現数とします。
整数がちょうど2個同じ
である必要があります。
を2個選ぶ組み合わせは通りです。
残り1つは以外ならなんでも良いので、通りです。
よって、通りです。整数をちょうど3つ選ぶ
である必要があります。
整数から3つ選ぶ組み合わせなので、です。全体から3つを選ぶ総数
となります。
3から、各整数についての1,2の総和を引けば答えとなります。
時間計算量は、かなと思います。なお、はに含まれる整数の最大値です。
E - Road Reduction
が、都市1から各都市への最短路であれば、条件を満たすことができます。
辺のコストが非負整数なので、ダイクストラ法で最短経路を求められます。ダイクストラ法で最短路に使用する辺がわかるので、これを残しておけば、そのまま問題の答えになります。
この方法によって、もう一つの答えの条件である辺が個になる、すなわち木になるかどうかについてですが、コンテスト中は、閉路はできないだろう、と直感的に解いてしまい、考察が不十分だったので、もう少ししっかり考えてみます。
説明1
ダイクストラ法の各段階において。最短路が見つかっている頂点集合を、見つかっていない頂点集合をとします。
ここから、のある頂点の最短路が決定するとします。
もし、に含まれる頂点がと辺で繋がっていたとしてもその中から最短路として選ばれるのはただ1つです。 よって、との任意の辺を繋いで閉路ができることはないです。
また、に含まれるもの同士で繋がることもあり得ません。
以上より、ダイクストラ法の各段階で、閉路が生成されることはないので、最終的に出来上がるものは木になります。
説明2
以下を証明してみます。
無向グラフにダイクストラ法を適用し、始点からの最短路を見つける。ダイクストラ法の各段階において、からの最短路が見つかっている頂点数が個であるとき、この頂点集合をとおく。また、に含まれる任意の頂点への最短路を構成する辺集合をとする。
からなる、の部分グラフは常に木であることを示す。なお、木であるとは、以下が成り立つことである。
- は連結
のとき、にはのみが存在し、連結です。より、を満たします。
のときに成り立つと仮定します。
ダイクストラ法によって、に含まれるある頂点の最短路が決定されるとします。
この時、最短路決定に使用された辺が存在します。なお、頂点はに含まれる頂点の1つです。
に、にがそれぞれ追加されたものがとなります。
まず、仮定よりは連結です。また、新たに追加されたはと連結なので、は連結です。
次に、、です。仮定より、が成り立っているので、代入することでが得られます。
以上で、帰納法によって、は常に木であることが示せたと思います。
Submission #31869657 - AtCoder Beginner Contest 252
F - Bread
解法は公式解説と同じでした。
公式解説のように解法の正当性を厳密に証明できませんでしたが、コンテスト中に大雑把に考えていたことを書きます。
操作の逆を考えたとき、長さと長さのパンから長さのパンを得ることを合体と呼ぶことにします。
まず、入力例1からどのように操作すると解が悪化するのか考えました。
例えば、
2+2=4
4+1=5
5+1=6
7+1=7
とすると、解は4+5+6+7=22になり、16より悪化します。
これより、大きい数に合体していくと解は悪くなりそうだとわかりました。ということは、逆に小さいものを2つ選んで合体していけばよいだろうと考えました。
次に、小さいものを2つ選んで合体すると、その後の解に影響を与えるか考えてみました。例えば、入力例1で、最初に1と1を合体した場合と1と2を合体した場合を考えます。
この操作によって、2と3のいずれかが生成されるわけですが、2や3はまた更に合体しないといけないので、追加で2または3のコストがかかります。それなら、1と1を合体したほうがよいです。
こんな感じでしたが、一応ACはできました。
Submission #31875956 - AtCoder Beginner Contest 252