A. The Play Never Ends
3 周期.
B. Perfecto
手前から可能なもののうち最小値を選ぶような感じで詰むことがなさそう(だんだん平方数が疎になってくるので詰みにくくなる).念のため rollback dfs の形で実装.
C. Trapmigiano Reggiano
終点を根として根付き木にして,深さが深いところから選んでいきます.深さ $d$ のものを選んだとき移動先の深さは $d$ 以下であることが帰納的に証明可能です.
D2. Infinite Sequence (Hard Version)
$2k>n$ のとき $a_{2k}=a_{2k+1}$ が成り立つことが漸化式から明らかです.
すると $a_1 \oplus a_2\oplus \cdots \oplus a_i$ という式は $i$ が $m$ より大きいとき,後ろの方がだいたい $2$ つずつ打ち消して,$m$ 以下部分の前計算しておける部分とあとは高々 1 項になります.これで $a_m$ を $O(\log m)$ 時間で計算できるようになります.
prefix sum については $[4n,4m+3]$ などの部分の式を書くと,mod 4 で 3 だったら半分に減らせるというタイプの式が作れます.
E. LeaFall
各頂点についての最終状態は 3 種類あり,「消える」「残るが葉にならない」「残るし葉になる」の 3 種で,これを適切に割り当てる木 dp をしていきます.葉になっているかの判定のため各 subtree において根の次数も持ちながら計算します.
さらに答を求めるには「残るし葉になる」頂点のうちちょうど 2 つを選ぶ方法の数え上げということになります.このタイプの頂点を作るときには選ぶか否かも決定して,木 dp の状態として subtree 内で選んだ頂点の個数も持ちます.
F. Towering Arrays
まず $i$ 番目として残すものと $p$ を固定したときの判定を考えます.左方向で残せるものの個数と右方向で残せるものの個数をそれぞれ求めます.よって片側について残せる個数の最大化を考えます.
これも二分探索することを考えます.左側に残す個数を決めたときに,なるべく小さなインデックスを残すようにとっていくことを考えます.すると各要素に対して「p – 個数がいくつ以下なら残す」というような条件を作ることができます.ここで動的セグメント木と二分探索を使います($\log^2$ つけましたが,$\log^1$ でもできると思います).
$(i,p)$ を決めたときに,「$i$ の左に $k$ 項残せますか?」という計算を考えます.これはクエリが $i$ 昇順に来るならば,上述の動的セグメント木と二分探索でできます.永続化しておけば $i$ を任意順にすることもできます.
これで $(i,p)$ を止めたときの左右の個数の判定ができるようになりました $O(\log^2N)$ 時間.
あとは $i$ に対する全探索をランダム順,$p$ に対する二分探索に自明な枝狩りを入れる全探索+二分探索テクニックでこの判定を $O(N+\log A)$ 回程度やればよいです.