AtCoder Beginner Contest 196参加記(~E問題)
水色なのにCでWA出たのでだめです
A - Difference Max
を大きくするとの値も大きくなる。逆に、を大きくするとの値は小さくなる。なので、の値を最大化する場合、は最大に、は最小にすればよい。つまりが答え。
最大化するときの基礎的な考えが問われる良問。
計算量は、。
B - Round Down
C++を使ってる前提で話すと、なんてデカい数は扱えない。文字列で受け取れば、「小数点以下を切り捨て」したいので、文字列の先頭からピリオドが登場する手前までを切り取って出力すればよいことがわかる。先頭から1文字ずつピリオドかどうか判定しながらちまちま出力すればよい。
計算量は、。
C - Doubled
解けなかった。
制約がある程度大きいのでで解こうと思ったがどこかで実装をバグらせたらしくWAが出た。想定解は前半の桁だけ全探索して以下か判定するというもの。発想としては全く難しくない。過去に類題も出てるのになぜその発想に至らなかったのか…。
計算量は、。
D - Hanjo
制約が小さいので、ピースの置き方を全探索する。再帰関数によるDSFを書いた。残りの畳の枚数と現在の敷き詰め状態を引数として渡す。もし空白のマスが存在していたら、そこに「縦長」「横長」「正方形」の3種類を敷き詰めた状態をそれぞれ作って再帰呼び出しする。もう置けない状態なら1を返す。こう書くと、返ってきた値の総和が求める通り数になる。状態数は超ざっくり見積もって最悪でも通りしかない(実際にはさらに少ない)ので全探索しても実行時間制限に十分間に合う。
E - Filters
考察を書く。間違っている可能性が大いにある。
もしくはが登場するまでにに足された数の合計をとすると、である。クエリが来る前段階では定数なのでこの答えはすぐに求められる。さらにと書ける。さらにさらに、関数の定義から、のほうが選ばれなければそれ以降が解に干渉してくることはない、つまり前から見て番目の関数でのほうが採択されなかったときの答えは事前に計算しておくことが可能である(計算量の話はあとで考える)。なので、とのどちらかがある定数より小さいことが判明すれば、その時点で解が定まる。関数が個あったとすれば、数直線が個の区間に分割され、さらにクエリで与えられる数値はその区間のどこかに必ず含まれる。
つまりどういうことかというと、「クエリで与えられた」と「関数のしきい値」をソートして前から見ていけばで答えが求まるのではないか?ということだ。
この「数直線を個の区間に分割する」ことで先ほどの前計算(が絡まない場合)の解も求められそう。(ここが求められずに時間が来てしまった)
ここで脳みそが疲れたのでやめた。
公式解説によると、この定義の関数は合成することができるらしく、「定数(低)」「」「定数(高)」の3パターンしかないとのこと。クエリの数がバカ多いので合成できそうだとは思ったが合成した後のグラフの形がなぜエスカレーターみたいになるのかはわからなかった。
感想
コンテスト終了後もE問題を粘って解いていたが頭が腐っていたので解けなかった。レートが20くらい無くなった