ABC153

ABC148と同じ。問題が(青までratedのコンテストとしては)簡単すぎる。全部誰かがMonsterと戦う問題になっていて楽しいセットなのに、全完でレーティングが落ちるんじゃratedコンテストとしては納得できない。2ペナ出してしまったのは反省点。反省点があるのがせめてもの救い。

A - Serval vs Monster

切り上げ。Fの伏線になっていたのがよかった。

B - Common Raccoon vs Monster

最初、貪欲かと思ってしまったが、ABCのBでソートは使わないよね。単に、和がH以上になるかという問題だった。HからAを引いていって0以下になるか判定する実装にした。

C - Fennec vs Monster

必殺技は体力が大きいモンスターに使うほうが得。昇順ソートして、必殺技を使わなかったN-K体のモンスターの体力の和を求めればいい。

D - Caracal vs Monster

「モンスターの体力が X>1 なら」というのが意味わからん。まあ「モンスターの体力が X で、X>1 なら」ということだよね。最小値とあるけど、選択の余地はないのでどんどん半分にしていくだけ。H>=1であり、いつか1になるので、そこを条件にしてループ。1回分裂させる毎に攻撃回数は倍になる。一斉攻撃していけばモンスターの数は常に2冪なのでシミュレーションしていけばいい。あ、ひょっとしてもっと簡単に解けるか。

E - Crested Ibis vs Monster

ナップサックやんけと思ったけど、同じ魔法は何回でも使える。これは、in-placeな更新でループ方向を順方向にすればいいのでむしろ実装は簡単になる(ということを必死で考える/思い出す)(思い出してもちゃんと考えて確認しないといけないから時間がかかる)。さて、過剰にダメージを与えてもいいのがちょっと厄介だ。えーと、A_iまではB_iでできるみたいなのを加えればよさそう。提出してREで「エッ」と声が出た。REだったので原因はすぐ浮かんだ。A_iがHより大きいことがあるのだ。直してAC。

ナップサックの簡単なDPくらいならさすがにすぐ書けるが、やはり苦手分野なのでね。本当はこういうの無限に時間が欲しい(ナップサックとの違いとか別の値でDPするとか納得するまで考えたい)。ただ、青コーダーなら時間をかけずに解ける問題だということもわかるので、頑張って短時間で解いた。まあ実力通りの1ペナ。

F - Silver Fox vs Monster

えらく簡単そう。左から貪欲でいい。なぜなら、攻撃する順番は結果に関係ないし、一番左のモンスターに攻撃するときは爆弾の攻撃範囲の左端にして損しない。攻撃範囲はD*2+1(半開区間)。Xでソートしておけばstd::lower_boundでいくつ先のモンスターまで攻撃できるかわかる。で、ここまで来て範囲加算が必要なことに気づく。何か牛刀を使わない解法もありそうだと思ったが、すぐに思いつかないので遅延セグ木を貼った。AtCoderでセグメント木を使うの5億年ぶりでドキドキだった(困るなあと思っていたw)。1個だけWAを出してしまい、32bit符号付き整数ギリギリまで使ってるD(をD*2+1に置き換えたもの)に注目すると、同じく32bitのp[i].xに足して二分探索のターゲットとして使ってしまっていた。オーバーフローしないように64bitで計算してmax(X)より大きい2^30とminを取り提出、AC。問題は簡単だと思っていたら、自分が使った道具に圧されて注意力を欠いてしまった。