A | B | C | D | E | F | |
問題文 | ■ | ■ | ■ | ■ | ■ | ■ |
自分の提出 | ■ | ■ | ■ | ■ | ■ | ■ |
結果 | AC | AC | AC | AC | AC | AC |
全体感想
41分全完で、24位でした。
問題Dで答が合わずに5分ほど溶かしていたのが下手でした。問題Fは、過去問の自己提出コードを改変したのですが、どう改変するのかが瞬時に判断できず、結局1からコードを読み直していました。人によっては問題Fはほぼ貼るだけだったかもしれません。
問題E、妙に思考がうろうろして悩みましたが簡単でした。こういうのの反応に時間がかかってしまいますね、うーむ。

公式コンテストの「質問」にデビューしました。全体公開される可能性を踏まえると、もう少し分かりやすい言葉を使う余地があったかもしれません。
問題E – Red and Green Apples
とうぜん美味しさはソートしておきます。赤色、緑色のりんごは
場合分けの軸を決めます。私ははじめ、使用する赤りんごの個数ごとに、最適解の様子を考えようと思いました。赤りんごの個数を決め打つと、無りんごと緑りんごから適切な個数を貪欲にとることが最適だと分かります。
「無りんご+緑りんご」をソートしておけば、赤りんごの個数を1個減らすたびに、次の候補となるりんごを取り入れることになります。
何となく違和感があります。無りんごと緑りんごを区別せず計算して本当に大丈夫?
検証しても大丈夫そうです。あれれ?緑りんごと無りんごの区別、完全に必要ない??ということは??
くらいで、気づきました。結局、赤・緑の個数を
問題F – Distributing Integers

サンプル3のグラフです。まずは、葉側から順に、葉側の塗り方をdpを計算して、そのあと根側から順に、根側の塗り方のdpを計算します。「〇〇側から順に」は、dfsで書いてもよいですし、一度適当なトポロジカル順序を得ておくと、指定の頂点順に for ループをまわすだけになります。
今回は、そもそも数え上げ要素もそこそこ難しいと思います。葉側の値を求める dp の計算は次のような感じです。


次は、根側の計算です。トポロジカル順序で根に近い頂点から順に計算していきます。ある頂点から根側につながる辺は1つしかないので、まず親を塗ったあとの塗り方が問題です。
親の頂点のまわりに関する計算が必要です。上の図であれば、さっきと同じ要領で、
どの数値に注目してどう計算すればよいかが分かれば、実装は難しくないでしょう。しかし、下手に実装すると計算量が

(1)
もともと
(2)左右からの累積を持つことで、数列
たとえば、 ABC 125:C – GCD on Blackboard に現れている要素です。
今回は、(1)(2)どちらでもよいです(私の提出は(1)になっています)が、(2)でないと上手く書けない問題も存在するので、どちらも覚えておくと良いと思います。
※ dp をマージする部分を上手く抽象化して、ライブラリ化している方もいらっしゃるそうです。私は現状、たいてい 1 から実装してしまっているので、その点については参考にならないです。