ABC178

全完したものの、競プロは俺には難しすぎる。Eまでもっと早解きしたいが頭がすっきりしないので正しさにある程度の確信を持つまでに時間がかかる。Fを自信持って考えたいが、自分にとっては複雑で上手く処理できない。

A - Not

好き。簡単なわりに問題文を読むのが大変で、時間がかかってしまった。実装も少し時間をかけた。x ^ 1 とした。Notを使いたい気持ちはあった。!xでもよかったか。これは思いつかなかった。他に、1 - x は思いついていたが、好みでない。どうやっても解けるが、これというものが出てこなかった。

B - Product Max

全探索ではないB。マイナス掛けるマイナスがあることに気づいて怖がる。考察部分がBにしてはかなり難しい。4通り試せばよさそうだが、コーナーケースが心配だ。頭の中で場合分けして大丈夫そうなので提出。

(解説を見て)片方を固定すれば確かに一次関数だ。なるほどなあ。

C - Ubiquity

すぐにはわからない。ヤバい包除原理じゃないだろうなと思ったところで、簡単な包除原理だと気づく。全体が10^N通り、0を含まないのが9^N通り、9を含まないのが9^N通り、0も9も含まないのが8^N通り。言葉にすれば簡単そうだが、ベン図を描いていたので「0を含まない部分を含まない」とか考えてややこしかった。まあ答え自体は簡単。

D - Redistribution

CはN=1とかがサンプルにあったけどDはないなと(気をつけようと思った)。Sが2000以下と小さいので、数列の長さを全探索できると思った。長さNを固定すれば各項から3を引いてS-N*3をN-1個の仕切りで分けるだけになる。項数は1以上で、1ずつ増やしてS-N*3が負になったら終わり。これで過不足なくカバーできる。

E - Dist Max

簡単そうだけどなあ。とりあえず図を描いて、端だけ見ればいいのかなあとかいや凸包で見る?とか。マンハッタン距離がdの場所ってどこだっけと思い、ここでナナメの正方形になることを思い出す。「マンハッタン距離は45度回転」じゃん。ド典型だった。4通りの端っこを見るだけ。思考停止で回転させても解けそうだが、まあちゃんと考える。端候補との距離を各点について計算しようと思っていたが、端同士だけ考えればいいと気づいてそうした。回転させたうえで上下と左右の端を求め差の大きいほうを出力。答えは4*10^9になりえるのでllを使う(よく気づいた(と思ったら座標は正だからintでいいじゃん!いま気づいた(B問題の制約に引っ張られたなあ)))。

F - Contrast

まず、各数が何個あるかという個数だけが必要な情報(ソート済みなんだからそれはそうなんだけど)。非自明なNoがないかを考える。その個数だけ左右から敷き詰めて、次の数をどう敷き詰めれば損しないか。けっこう考えて、被った部分を必ず分配できることに気づく。さらに、その状態で既に被りがなくなっていることに気づく。実装もかなり悩んだ。個数ベースよりはreverseして被った区間を求めるのがいいかな。できないケースでswap処理するの怖いので、Noは最初に判定してしまうことにした。


Aも並べ替えていいものとしてよい。最終的にAでソートしてBを出力するのだが、せっかくソートしたのに元のBを出力してしまっていた。throwを入れたりして様子を探ったが、REがないということはYesのときは正しいしNoもさすがに正しい。なのに3つだけWAになる。よく時間内にACした。4ペナはまあ仕方ないw