ABC173

けっこうしんどい回だった。E以外の5完。

A - Payment

答え自体はすぐ思いつくけど、「それで絶対に漏れがないか」になかなか確信が持てない。実装もちょっと長くなってしまった。

B - Judge Status Summary

長さ256の配列を用意して、先頭の文字番目をインクリメントして数えた。しかし、出力でも"AC"とかの文字列が必要なのを忘れていた。結局string[4]を用意するなら、最初からそうすればよかったか。でも連想配列はさすがに(通るだろうけど)重いし、提出したコードより簡単にはならんかな。そんなに迷った記憶はないけど、それなりには時間かかってる。

C - H and V

全探索。2^(H+W)という形は見慣れないのでそこが面白さ。まあ素早く正確に実装するのはきつい。

D - Chat in a Circle

大きい順に使うとよさそうだけど、難しい。21:26くらいまで考えてEへ。

最初に考えていた、大きい順に貪欲に取っていくみたいのを実装しようとする。どうやって?最初の2個を置いたら、次の2個、次の4個、次の8個ときれいに置いていけそう。貪欲といっても色々な置き方があるので不安だが、こういう置き方だとわかればまあいけそうではある。r += a[i / 2]; だけになって、思ったよりずっと短いコードになった。ということで未証明AC(何千人も解いてるのでこれで通らないとは考えにくい)。「A_kの寄与は2回まで」というのは思いつきたかったね。

E - Multiplication 4

簡単そうだけど負の数があるから難しいのね。困難はなさそうだが場合分けが組合せ爆発して頭がウニになってきたので、落ち着いて21:46くらいにFへ。

残り40分。これだけあればACできると思い考え続けるが、もうとにかく気をつけるべき要素が多くて自分のプログラミング力では足りない。残り15分くらいになって、無理そうだと思いDへ。

残り10分。ACしてないのはE問題だけ。普通にやったら絶対無理なので、正確さは度外視して無理やり最後まで書き切ってみたが、サンプル通らず。時間に合わせて書き切る技術があるのは良い。最終的な方針は、「0を選ばざるをえない」「0を選ぶ権利がある」「積を正にできる」「それ以外(答えは負になる)」などで場合分け。答えの符号を固定したら、絶対値が大きい(小さい)順にとって、負の数の個数が合わなかったら正の数と負の数を交換する(最大で2通り考えればよさそうだが自信がないし、それでいいとして実装がクソ重い)。modとってるので大小比較がめんどい。doubleに変換してlogを足してくのも考えたが、さすがに落とせそう。

F - Intervals on Tree

けっこう解いてる人が多いので「全完回か?」と思い始める。愚直にやるとN^3くらいかかりそう。Nを2つ落とすのはきつい。とりあえず適当な木を描いて連結成分が生まれて消える様子を見る。ここで、関数fが単に頂点数であれば簡単に解けることに気づく。これ、各辺について何回カウントされるかわかれば、1回につき連結成分が1個減るからもうそれ答えなんじゃ?一つの辺に注目するみたいの、一昨日のyukicoderでできなかったんだよね。グラフを構築する必要もなく、短いコードでAC。DよりもEよりも簡単だった。