Kotlin Heroes はコンテストには参加せず,C++ や Python で書いたコードを chatgpt に変換してもらうことで AC しています.コンテスト中にこれをやるのはルール違反です.
A. 1-3-5
$N\geq 8$ なら答えは $0$,それ以下は個別処理.
B. Clock in the Pool
$3k$ 周期.
C. Firewood
分割して,使えるなら使ってそうでなければ捨てることを繰り返す貪欲.
D. Staircase
a[i] = 0 であるところで区切って正のところをそれぞれ解きます.長さが偶数なら全部 $2$ 個ずつで,奇数ならば parity が適切なところをひとつだけ単独でとります.
E. Yet Another Permutation Constructive
また同じ $k$ に対する解に対して要素数を増やすことは簡単にできるので,最小要素数のものを作れればよいです.再帰的につくっていきます.
F. Narrow Paths
可能なパスの個数は,上から下に降りる位置として可能な区間から分かります.目的の個数にするにはその長さの区間をとればよくて,区間をとったときの選び方は端の場合を除いて一定なので,階乗前計算のもと $O(1)$ 時間で計算可能です.$0$ 通りの場合は全体から引くことで求めます.
G. Observation Towers
1 つの塔を使う場合と 2 つの塔を使う場合でそれぞれ解きます.1 つの場合には中点,2 つ使う場合には目的値、の左右どちらに塔があるかで場合分けすれば計算できます.適当な prefix, suffix に対する min, max の計算に帰着できます.
H. Composite Spells
呪文の列を sum と途中での min の組として表せば,その合成が記述できます.
I. Equal Trees
残す頂点集合を $S$ とすると,$a,b\in S$ に対して $a\in \mathrm{subtree}_{tree_1}(b)\iff a\in \mathrm{subtree}_{tree_2}(b)$ が必要です.逆に根が残っていてこの条件が成り立つなら同じ木が残ります.
よって適当なグラフの最大独立集合問題として解くことができます.根は孤立点になっていて特にアルゴリズム上の工夫をせずとも最大独立集合に含まれます.
J. Necromancer
$L$ をスライドしながらクエリを処理します.各要素のコストが変化する回数は,$O(\sqrt{a_i})$ 回です.変化させたタイミングで次の変化タイミングを計算するようにすれば,これらを全体で $O(N\sqrt{A})$ 時間かつ $O(N)$ 空間で検出できます.
結局やるべきは,要素ごとのコストの変更 $O(N\sqrt{A})$ 回および,区間和 $O(Q)$ 回ということになります.平方分割を利用して変更 $O(1)$ 求値 $O(\sqrt{N})$ 時間で処理すれば,全体で 1.5 乗時間になります.