ABC159

ここまで安定して悪いパフォーマンスとってると本当につらい。もうこの頭は難しいことを考えられないのか?簡単なことは多少遅いけど考えることができてる。もう新しいことは何もできないつまらない人生。

A - The Number of Even Pairs

最初a*a+b*bって書いちゃったけど、同じものは2回選べないし順番も考慮しないのね。するとa*(a-1)/2になるので、「Aでこんな長いコード書かせる?」と思った。n,mじゃないのは、ABC前に用意してるテンプレがa,bだから。

B - String Palindrome

これ入力が回文だと一瞬思っちゃうよね。回文に対して、強い回文かどうか判定するじゃん普通。それに元が回文なら前半だけ回文か判定すればよくて面白いし。(n-1)/2と(n+3)/2の差が2なのを一応確認する。

あ、この問題でも(全体と前半をチェックすれば)後半はチェックしなくていいの気づかなかった。

C - Maximum Volume

均等に分ける。証明:順位表でCにペナルティが見当たらない。というゴミムーブをした。さすがに正しいに決まってるしABCでこれの証明に10秒以上かけられないけど、でもこれも証明できないのかあという。

(解説放送(最近すぬけ解説のわかりやすさに気づいた)を見て)証明。2次元の場合なら、均等じゃないときは(a+ε)*(a-ε)=a^2-ε^2なのでa^2より小さくなる。3次元以上でも、異なるものがあれば(a+ε)*(a-ε)*(他の長さの積)となるので、aとaに変更すればより大きくなる。じゃあ均等だったらそれより大きいのは本当に存在しないのかよ、というのはあるが、まあ他に最大値ないし。

D - Banned K

A問題で使った式が使える(こういうのわりと好き)。A_iもN以下で楽にカウントできる。あらかじめ、ボールを除かないときの値を求めておいて、各ボールの整数の個数が1個減ったときを足し引きで求めればいい。カウントと2個選ぶパートがメインかと思ってたら、差分計算がメインだった(思ったより実装が重い)。元が0個だったら1引いちゃダメじゃんと勘違いしていたが、存在する整数が0個なわけなかった。

E - Dividing Chocolate

問題文読んでも図の右下のやつがNGとは思わんよね。チョコレートは動かしちゃいけないらしい。さて、高さが1なら貪欲でいい((左から見ていくとして)そこより左で切るメリットがない)。制約を見るとHが10以下なので、横方向に切るやり方を2^(H-1)通り全探索すればいい。制約に答え書かないでほしいと思ったけど書かないわけにいかないので仕方ない(?)。さて、実装が意外なほど重い。横方向の切断をビットで表してあって切断回数+1の区間それぞれでカウントして1個でもオーバーするか判定、オーバーしたら切断位置を1個戻さないといけない、横方法の切断の仕方によっては条件を満たす切断が存在しないこともある(しかし必ず1個は答えが存在する)。頑張って時間かけて書いて一発ACは運だなあ。

F - Knapsack for All Segments

解けなかった。問題文を理解して、問題名の意味がわかる。ナップサックと全然違う方向から解けそうだと思うが、少し考えてわからないので、とりあえずナップサックを書いてみる。これで解けるかと一瞬思ったが、3乗なので間に合わない。方針としては、上手く途中経過を使いながら普通にナップサック、和がSになる集合それぞれについて集合の要素が存在する区間を考えその区間が何回足されるかを数える、その中間で区間の右だけ固定して上手くやる。しかし3つともダメだった。他には、いかにも無理そうだけど、左右から普通にナップサックしてその情報を上手く組み合わせる。これもダメ。あとは、2乗が通るので色々な2乗を3回くらいやって解けるみたいなのもありそう。これは何も見えない。全体として(今回のABC全体ではなくFの考察全体)頭にキレがなく自分の凡庸さを思い知るだけの時間だった。

(すぬけさんのコードを見て自分もAC取って)最初の3乗のやつはよく見ると重ねることができて2乗になる。ただのナップサックでループ毎にdp[0]++;するだけでよかった(i回目のdp[0]++;がL=iの寄与)。愚直に一工夫かあ。こういう面白いのは解きたかったなあ。完全に力不足で無理だったけど、これができないんじゃ何のためにAtCoderやってるんだよ。