ABC281

6完。久しぶりに黄色でABC。解けなくても焦りがない。わからなくて嫌な気持ちになったり勘違いに気づいて声出したりはそのままある。

A - Count Down

簡単でいいね。35秒。

B - Sandwich Number

整数が6桁なので全体で8文字である必要がある。その上で両端の英大文字は簡単に判定できて、あとは整数部分。最初が0であってはダメで、あとは数字であることを確認すればいい。けっこう難しい。絶対にやりたくないというほどではないが、あまりやりたくはない(面倒というより難しいので)。

C - Circular Playlist

難しそうに見えるが、よく読むと合計の長さ(Sとする)を計算してT=%Sとしてしまっていい。あとはシミュレーション。TからA_iを引いていって初めて負になったときiが答え。負になったTにA_iを足して戻せば曲iが始まった時点で何秒残っていたかもわかる。

D - Max Multiple

DPっぽいけど答えがでかくなるなあ、いや、答えは添え字じゃなくて中に入れるのか。ということでDP。dp[c][j]を、これまでにc個選んでDで割ったあまりがjだったときの和の最大とする。最初は、0個選んであまりが0のときの最大が0で他は-∞で初期化する。cが小さい順に回せばin-placeで更新できる。

E - Least Elements

簡単そうに見えるが、楽な解法が全く見えず、multisetを2本使うことになり破滅した。まあできるんだけど、実装にかなり時間がかかったし、必要な処理を一つ忘れてサンプルが合わず更に時間を食った(小さいK個を入れるほうのmultisetにK-1個入っていてもう片方に1個以上入っているとき、もう片方の最小よりも大きい数を加えてちょうどK個だからOKみたいに勘違いしていた)。

F - Xor Minimization

ACした時点で、なんで解けたかわかってない。昨日(比喩)の自分を信じて実装を続けたらできていた。かなり抽象的で難しい。二分探索を思いついて判定ができるか考えているうちに、答えを上のビットから決めていくことを思いついた。一番上のビットが、全部同じなら全部消せるので1bit少ない問題に帰着できた。そうでないとき、どちらかに合わせることになる。そうすると、1にした側を最小化すればいい。30bitあったら2^30通りに分かれて大変じゃん(まあ全部でN個だから大丈夫なはずだけど)。混乱したので再帰に任せる。各階層(30個ある)で処理する合計の長さがNなので計算量は大丈夫なはず。全部同じなら全部(実際にA_iをいじって)0にして、違うときは全部1にしてから違った場所で分けて再帰(最初に1回Aをソートしておけば連続した区間になる)。

G - Farthest City

条件を満たすグラフでBFSしたことを考えると、頂点1からの距離によっていくつかの階層に分かれる。最後の階層は頂点Nのみ。同じ階層同士は辺があってもなくてもいい。隣の階層同士は、後の階層の頂点からは前の階層に1本以上の辺が出ている必要がありその上で他は辺があってもなくてもいい。他の辺はあってはならない。ということで、なんとか数えられないか考えていたが、しばらくしてDPを思いついた。なるほどね。dp[i][j]を、これまでにi個の頂点を消費し最後の階層の頂点がj個のときの通り数とする。求まったものから配っていく。頂点Nの扱いがややこしいが、とりあえずN-1個消費するまで求めてそこから求めることはできそうだ。3乗でNも大きめなので、同じ階層同士の辺の処理は前計算しておく。隣との辺の処理は難しいが、後の階層の頂点毎に考えて、前の階層への辺が一つもない1通りだけを除けばよい。あとは頂点の選び方だが、ここで間違えて時間がかかった。ここらでコンテスト時間が終了。permじゃなくてcombだ。しかもMが素数とは限らないので逆元を取ろうとして落ちていた。これは単にパスカルの三角形を作っておけばよかった。なかなかサンプルが合わなかったが、頂点Nも数に含めてしまっていた(1を引きましょう)。頂点Nだけ別に処理する必要もやっぱりあった。これは時間がかかる。