WBC004
全完2位でした。今までで一番難しかった。
A. 79Gold
なんかタイトルが動いて笑った。解法は全体の3割が何人かを計算して、はい。
B. Linear Code
奇跡的に線形符号の性質を知っていた。 答えはだが、線形符号であるという性質を使うとなので、に注意して、求めるべきは。*1
ここまではよかったが、popcountを求めるときに__builtin_popcountllでなく__builtin_popcountを使って1WA。
なんか202点とれるらしい。(競プロ中に謎解きを始めるな)
C. Blurred Numbers
正規表現が読めるなら正規表現を見た方がわかりやすいかも。 1000の位、100の位、10の位、1の位がどこで区切られるかを全探索する。 各位は空文字列でもいいことに注意。 最初?がI, V, X, L, C, D, M以外になることはあるかのclarを送ろうとしたけど調べたら、そもそもローマ数字は基本3999までらしい。
D. Photosynthesis
光合成をするのに必要なコストは初めに各からを引いておけばいい。 これによって、を含む区間で、その和が最大のものが求める問題になるが、これは累積和を使ってで処理できる。
...がデバック出力消し忘れ+オーバーフローで4WA...
E. Link
見た目がごついが、よーく見るとギャグ。
制約から最初の状態はある1つの連結成分に含まれるノード以外はすべて次数は0。 このことに気をつけると帰納的に、すべてのタイミングである1つの連結成分に含まれるノード以外はすべて次数は0で、追加されるリンクに繋がるノードのうち片方は必ずその連結成分に含まれるノード、もう片方は等確率で選ばれたノードであることが分かる。 よって、最初の状態の連結成分のサイズが分かれば、時刻にネットワークが連結である確率がdpで計算できる。() したがって、最初の状態での連結成分の大きさごとの場合の数が分かればよく、これは連結成分の大きさをとして、で計算できる。(自由に割り当てられるリンクが個、割り当てる場所が個なので)
計算量は
F. Maximum Flaw Problem
まず、条件を満たす流れ方が存在するかを考える。 1番目のタンクから考えるとすぐ次のタンクには流せるだけ流す必要があり、余った分も可能な限り他のタンクに回せばいい。 このことを踏まえて、割れ目が最大になるようなタンクとその流出量を決め打つと、決め打ったタンクについてのみ流出量を減らして上と同じようにすればそれが実現可能かどうか判定できることが分かる。 これをすべてのタンクについて二分探索すれば、計算量はで十分高速となる。
全体を通しての感想
どれもなかなか歯ごたえがあって面白かった。WBC005も期待しています!
あとブログ書くのってとても疲れる...
*1:証明が不十分ですが気持ちだけ。あとは0000......0が必ず含まれるので...という感じです