ABC112

ちょっと毛色の違うABCで面白い。CもDも解く前提でDを先にやる、みたいなムーブもあった。

A - Programming Education

分岐するという、こんなんがAでいいのかと思う複雑さ(まあAらしくはある)。これを1分ちょうどでACできたのはいい動きだった。

B - Time Limit Exceeded

「スマートウォッチであるあなたは」っていうの読んでなかったなあ。やるだけではあるが、条件がやや複雑。提出したとき、簡単なのに思ったより時間かかったなと思った。

C - Pyramid

かなり難しい問題設定。しかも(?)サンプル2なんか中心位置の制約を使ってかなりヤバい推理をしている。とりあえずピラミッドの絵を描く(向きを45度間違えて認識しないよう確認)。2次元なのできつい。1次元なら2つの情報から推定できそうなのに。特定できるという制約を使うんだろうけど100個のバラバラな情報を統合する方法が見えない。開始10分まで考えたところでDを見る。
Dから戻ってくると、中心座標の全探索が見える。普段のCDと逆で、Dを軽く(時間はかかったけど)やっつけてからCに臨むというパターンだ。これで腰を据えてCに取り組むことができる。ということろで全探索が見える。高さの範囲が広いので思いつかなかったのかなあ。Cなので、何か数学的なかっこいい技で解けるというイメージ(思い込み)もあった。さて、特定できるという制約から、矛盾がなければそれを答えとして出力していいことになる。中心座標とh_i>0を仮定すると、各情報からピラミッドの高さを推定して不一致がないことを確認すればいい。h_i==0の場合だが、これは高さが一定以下という条件になる。そういう情報も別に持とうかとも思ったが、それは複雑になる。矛盾がないか確認するだけだから、まずh_i>0の情報だけで矛盾がないことを確認し、その上でh_i==0の情報を加えて矛盾するか見ればいい。構造体のソートは気軽にできるようになっている。h_iの降順でソートし、その順に処理して矛盾がなければそれが答え。一応正しい答えになるようきちんと考えたつもりだが、これだけ道を歩いてきたら何か穴がないか不安にもなる。ACで、ノンペナ全完は嬉しい。力を出せた。

D - Partition

これはさすがに解ける見た目をしている。とういことで、Dを先にやる。まず「最大公約数って元の数より大きいんだっけ小さいんだっけ」というところから。大きくないね。その最大公約数をxとおくと、a_iはxの整数倍だ。それらを総合したMはxの「N以上の整数」倍。つまり、O(M)でいいなら簡単だ。NからMまでの整数を全部試して、最初に割れたやつ。Mの約数列挙はO(√M)でできるから、これもできるはず。それはわかったが、具体的に実装しないといけない。NからMまでというのに条件を加える?Nが小さかったりMが素数だったりするけど全部に対応できる方法は?Nが1のときを別に処理する?簡単なのはわかっているので、O(M)のコードを見ながら√M回のループを書き進める。約数が2つ出てくるが、「少なくとも片方がN以上」なら使える。N以上のやつじゃないほうのmaxをとるのだが、それがN以上ということもある。両方が「N以上のやつじゃないほう」であることもある。複雑だよねえ。普通にACしてCへ。
もうちょっと順位いいと思ったけど、Cで悩んだし、Dの実装で手間取ったし、まあそうか。CとDがちょっと変わってたので、22時に間に合うか不安になってた(始まる前は当然間に合うと思っていたが)。22時からは、ブログ書くのを中断して、かみ・まはーら戦の放送を見る。ほんとは21時のおいうリーグも見たかったけど、それはどうやっても無理。解説放送のために途中で抜けるchokudaiさんを見て申し訳なく思った。