現在の位置xとして、y=x+Aとする。xの蓮を消してyに移動するこのとき、y=N-1ならゲーム終了。なく、yの蓮があるなら得点s_yを得る。yの蓮がない場合は得点を10^100減らして終了。現在の位置xとして、y=x-Bとする。xの蓮を消してyに移動するこのとき、y=N-1ならゲーム終了。なく、yの蓮があるなら得点s_yを得る。yの蓮がない場合は得点を10^100減らして終了。手順2に戻る最終得点をできるだけ大きくしたい場合、最終得点はいくらになるか。問題文から以下がわかる。N-1」のように推移する。手順3ではN-1に達することはできないので、手順2の時にN-1にたどり着くように終わらないといけない。N-1」となるようなxがある。単純にA,Bをループで回すとxはO(1)で決まるが、スコアの計算にO(N)かかってしまう。全体としてはO(N^3)で間に合わない。N-1」と考えて、xとA-Bでループを回すことを考える。(これに気付くためにはAとx、Bとxとかも考えていればたどり着ける?)C=A-Bとして、これはループを回すとして固定して考える。x=1からループを回すと、AとBが決まるので、どういう蓮を通っているかを表示してみると、左右からCずつx個取るような対称形の法則性がでてくる。この法則性を活用すると、取る蓮が同じになるようなものをまとめて、かつ、xを順番に増やすことで効率的に求めていける。・x*Cが範囲を超えないようにする・A,Bの条件をちゃんと満たすかチェックする・左右から取っていったときに、すでになくなった蓮だった場合は条件を満たせないので、すでに取った蓮かどうかを記録しながらxを増やしていくCとxのループは、ΣN/iのような形になるのでO(NlogN)の計算量になる。辺に正の重みがある連結なグラフが与えられる。»プロフィールid:phyllo_algoレッドコーダーへの道のりは遠い。)はてなブログをはじめよう!phyllo_algoさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。