ABC187

んー、ちょっと不満が残るかな。ノンペナ全完ではあるけど、CEF辺りで無駄に(今の自分には必要な時間だから無駄というのは違うんだけど)時間を食った。

A - Large Digits

3桁であることを利用して、for文を回す。最初3桁固定と気づいてなくて、桁和の関数を書く前提で始めてしまい、ややちぐはぐな実装になってしまった。

B - Gentle Pairs

ちょっと怖いけどまず絶対値とっちゃう。状況を思い浮かべてみると傾きが緩やかなものを数えればいいので、やはり差は絶対値とっていい。あとはdyがdx以下ならいい。テンパって除算がないように式変形したけど、まあ意味を考えればそらそうの形。

C - 1-SAT

普段問題名は意識に上らないけど、これはさすがに認識する。内容と問題名を見て、2-SATを知らないことでやや不利になったなと思った。まあやるだけではあるんだけど、どういう実装がいいかかなり悩ましい。どうやってもできるだけに、選べない(選択を間違えると実装時間がかかる)。結局ソートにした。structに'!'を分離して文字列とフラグを格納。'!'を除いた文字列でソートして、隣同士で同じ文字列かつ'!'の有無が異なるものがあったらそれ('!'が付いてても除いてあるのでそのままでいい)を出力して終了、そうでなければ"satisfiable"を出力。こういうのstd::mapで瞬殺しないといけないんだけど、解説にあるような実装がパッと出てこないんだよね。unorderedのが実行時間で有利だというのも思いつかないし、setでいいというのも思いつかない。

D - Choose Me

パッと見、古き良きAtCoder。青木君が先に出てきて混乱する。青木のAってことかなあ。演説でどれだけ得をするか考える。0, A+B, A, 0 とか紙に書いて、ちょっと混乱していたが、演説を全くしないとき Σ-A だけ負けてて(あ、ΣAだけ負けてるが正しい)、ある町で演説をするたびに 2*A+B だけ差が詰まるということだ。これは 2*A+B だけ記録しておいてそれをソートして大きい順に演説していけばいい。同数ではダメなので、0-0になるような心配もない(この問題設定の場合はありえないけど)。

E - Through Path

Dもそうだったけど、これもintに収まらない問題だね。根付き木として見て、自分を含めた子孫全員にxを足す。「オイラーツアーか?」と思ってセグ木LCAをあさり始めるが、よく考えたらDFSするだけのやつだった。で、親側全部に足す場合は、全体に足して子孫で引けばいい。親子の判定のためにまずDFSして深さを求めておく。ここで、a, bの順番に意味があることを忘れ、親がaになるようにswapしてしまう。サンプルが合わなくて気づくんだけど、ここからが混乱of混乱だった。aが親という思考に慣れてしまっていたのも痛かった。足すのは子側で、それが指定された頂点でない場合は全体に足して子側にマイナスを足すということ。最終的にはできたけど、2択がいくつもあって全部正解しないといけないので、混乱してると完全に無理になる。落ち着いて考えたいけど無理なんだよね。最初から混乱しない道を選び続けるしかない。

(解説を見て)あー、これいもす法の木バージョンか。

F - Close Group

条件が「ならば」の形なので難しい。かなり考えて(最初はなぜか頂点を横に並べて隣同士だけ考えてたし)、いくつかの完全グラフに分解しろということだとわかった。まず、頂点の選び方2^N通りについて完全グラフかを判定する(これはできるので)。辺を隣接行列で持っていたが、O(N^2*2^N)になってしまうのが嫌なのでビットに詰め込んだ。頂点の部分集合をkで表しているとき、それに含まれる各頂点について隣接(自分も含めておく)のビットがkを含んでいれば完全グラフ。DPになるかと思ったら直接計算できた(最初DPで考えててどうやるかけっこう混乱してた)。

さて、あとはこの情報を使ってDPで答えを求めたい。分割の仕方が多すぎて無理そうにも見えるが頑張って考える。頂点数が1以下は自明なので場合分けしておいて。高速ゼータ変換は浮かんでいたが、(可能だとしても自分には)無理だと思っていた。で、そこからの関連でO(3^N)のやつかと思いつき、ググっていつも見てるこの記事に行って「ちょっとしたテクニック」のところをコピペしてくる。自分自身を参照してはいけないので、最大値としてpopcntを入れておくことで対策とする。なんか書けた。サンプルは合わない。情報を出力させておかしいところを絞り込んでいく。かなり時間がかかった。結局、完全グラフ判定のところで、完全グラフでないならループを抜けるように書いたつもりが毎回抜けていた。そこを修正してAC。

今回、テンポよく提出することを意識していて、まあそれ自体はできていたんだけど、全体としてかなり時間をかけてしまった。