ABC188

どうもコンテストのやり方がわからなくて、主に早解きがぎごちなくなっている。更に、WAを2回も出してしまった。どうも動きが固い。ただ、そんな中でもレーティングはほぼ変わらずで、競プロの調子(実力と言ったほうがいいかもしれないけど)は良い。

A - Three-Point Shot

swapしかけたけど差の絶対値が3未満か見るだけだった。読んだ瞬間解けるけど、解けるだけではいい実装はできないのでかなり考えてしまった(あげく微妙なコードに)。

B - Orthogonality

ベクトルAとBは別々に与えられるのかあ(そりゃそう)(サンプル通らなくて気づいた)。内積はintに収まりそうだけどll使っちゃった。

C - ABC Tournament

どういうトーナメントかを問題文から読むのに時間かかった。まあ予想通りの形だけど。実装は簡単そうだけど書き始めるまでがなんか時間かかる。結局std::pairでレートと番号を持ち、長さを半分にしながらループでmaxとっていく感じの。

(解説見て)問題文を読んでいるうちに混乱して忘れていたが、左の1位と右の1位の小さいほうでいいよね。まあ愚直にやるほうも知ってる実装なので問題ないけど。

D - Snuke Prime

これいい。簡単そうで普通には解けなくてでも実装は重くないの。プライムは1日単位で使えるので、b_iが20万以下とかならプライムを使わない各日のコストをいもす法で求めCとのminを足していくだけ。この問題の場合は10^9なので座標圧縮を考える。やりたくねえなあと思いながら実装を考えていくと、別に座圧は必要ないと気づく。aやbは半開区間にしておいて、いもす法の足し引きを長さN*2の配列に入れて時刻でソート。順に足していけばいもす法の結果が得られる。そのコストであるような時間の長さは、2つの時刻の差なので、同時に足されてるところはちゃんと0になるし、実装も足す前に前回の時刻との差をとれば楽。解法がわからない頃はオーバーフローが心配だったが、ちゃんと64bit整数の範囲でできている。

E - Peddler

グラフとして見るとDAGなのでDPできそう。配るDPはメモリがランダムライトになりランダムリードより少し遅いイメージがあってあまり使わないのだが、この問題の場合はあまりにも素直に書けるのでさすがに配る。この町に来るまでにどれだけ安く買っておけるかでDP。買った町では売れないので更新の順番に気をつける。提出してWA。INFの設定がけっこう面倒だったねそういえば。2^30円で買えるとしていたが、それを10^9円で売れば利益は-INFより全然大きい。2^30のときは売らないようにしてAC。

F - +1-1x2

シンプルな問題設定から吹き出す複雑な世界わりと嫌い。Xのが大きいと1ずつ減らすしかない。X=30, Y=40 とかだと、そのまま10増やすか2倍して20減らすかを比較して前者になる。XがYより十分に小さければ途中で上手いこと調節できそう。ここを深く考えると、K回だけ2倍するなら1増やすタイミングで1, 2, 4, ... , 2^K だけ最終的な値を動かすことができる。じゃあ2進法で表すだけで簡単かというと全然ちがくて、1減らすこともできるから111101bを1000000b減らしてから11b増やすというのも(残念ながらw)可能。これ下手にやると10^18回近い計算回数になってしまう。桁DPできるかなあ、できそうだ。D=abs(X-Y) として、Dおよび-Dについて下位i桁までを最小何回で表せるか。符号反転は、ビット反転して1を足せばよい(あれ、今気づいたけど最下位以外のビットがDと-Dで逆とは限らない!嘘を通したか?)。で、2^Kより大きい部分をどう処理するかがわからなかった。色々考えて、2^K以上の部分を最初に引いてしまう(操作回数としてカウントする)(ビットKが0になるので更に1を引いて-Dの世界へ行くことも普通にDPするだけでできてる)というのに辿り着き、ようやく「解けそう」になった。というかもう解けている。提出してWA。2^Kで割ってそれを引いてるじゃん掛けてから引いてください。AC。

(解説を見て)なにそれ。よく解けたな。

(追記)普通に運良く(悪く)通っただけだった(撃墜ケースがいくらでもある)。修正してACとっておいた。