A. Jellyfish and Game
一部のアイテムが上位アイテムに置き換わった上位互換の関係があるとき,上位の盤面からスタートした方が最終スコアは良くできます.例えばターン数について帰納法を考えればよいです.交換しないというパスの選択肢があることも使います.
なので結局行動は,自分の最弱の手持ちと,相手の最強の手持ちについて,交換して良くなるならば交換する.というものになります.
初手を除き,常に全アイテムの中で最強のものを手番を終えたプレイヤ,最弱のものを反対のプレイヤが持つ状態になり,$2$ ターンごとに状態がループすることが分かります.
B. Jellyfish and Math
難しい.
操作は bitwise の変換なので,$k_1, k_2$ について,
- 「$a$ の $k_1$ th bit と $a$ の $k_2$ th bit が等しい」
- 「$b$ の $k_1$ th bit と $b$ の $k_2$ th bit が等しい」
- 「$m$ の $k_1$ th bit と $m$ の $k_2$ th bit が等しい」
の全てが成り立つならば,操作の過程で常に(特に終状態の $c,d$ についても)これらの条件が保たれます.
すると,このような $k_1, k_2$ をまとめてしまってよいです.入力は $2$ 進法 $30$ 桁ですが,これらを適切にまとめると bit は $8$ 種類以下ありません.これら $8$ 種の bit がどう変換するかごとにコストを求めておくという前計算をしておけばよいです.
C. Jellyfish and EVA
ある頂点からゴールできる確率を後ろから順に計算する dp を考えます.
$v$ の行先が $w_1,\ldots,w_n$ であるとして,$\mathrm{dp}[w_1]\geq \cdots \geq \mathrm{dp}[w_n]$ を仮定します.最適行動における $v\to w_i$ の確率が分かればこの dp ができます.
最適行動はどの頂点への遷移確率も $1/n$ を超えられず,したがって初手に $w_1$ を選ぶのがベストであることが,帰納的に証明できます.初手の行動が $\mathrm{dp}[w_i]$ の比較だけから決まることから,遷移確率もソート順だけで決まることが分かるので,これを事前計算しておけばよいです.
行先が $n$ 箇所の場合の遷移確率は,行先が $n-2$ 箇所の場合の結果を使って順に計算します.
D. Jellyfish and Miku
まず $a$ を決めたときの期待値の計算についてですが,これは有向辺ごとに通る回数の期待値を考えれば分かります.結局,$\sum a_i = m$ のもとで $\sum_{i<j}\frac{a_i}{a_j}$ を最小化する問題に帰着されます.
ここから,$O(nm^2)$ 時間で動く dp があります.$a_i$ まで決めた時点での $\sum a_i$ を状態とすればよいです.
$$\mathrm{newdp}[i]=\min_j(\mathrm{dp}[i-j]+\frac{i-j}{j})$$
といった処理になります.コンテスト当日はここから,$\min_j$ の中身が単峰であると予想して最適化したら AC してしまった(■)のですが,Div2 版ではハックケースが追加されていて WA となります(■).なので,この問題の検証は Div2 版で行うのが良いでしょう.
適当なスワップ操作を考えると,最適な列 $a$ について,$a_1\leq a_2\leq \cdots$ を仮定できます.ここから $k$ ステップ目の dp 更新について,$j\leq M/(N-k+1)$ を仮定できて,これで $O(NM\log M)$ 時間になります.
E. Jellyfish and Hack
多項式時間で解くのは簡単で,あとは高速化技術が少しあればよいです.
長さ $n$ の場合のコストごとの数え上げを表す母関数を $f_n(x)$ とすれば,次のような漸化式になります.
$$f_n(x)=x^n\sum_{i+j=n-1}\binom{i+j}{i}f_i(x)f_j(x).$$
毎回 FFT 畳み込みをすると $O(N^4\log N)$ 時間です.
$\pmod{10^9+7}$ の状況なので garner が絡んで面倒ですが,$f_i$ を畳み込みに使うための FFT を,$(n,i)$ ごとではなく各 $i$ ごとに $1$ 回だけ行うように実装すれば,$O(N^4)$ 時間になって AC が得られます.
もっと簡潔なのは,適当な評価点 $a_0,a_1,\ldots$ を用意して,$f_i(x)$ ではなく列 $(f_i(a_j))_j$ を持つことです.評価点ごとに独立に dp の遷移を行えて,最後に多項式補間をすればよいです.
多項式の評価点を等比数列にしておくと多項式補間が少し高速になりますが,解法全体からすればここはボトルネックではないでしょう.
F. Jellyfish and OEIS
順列を任意にとると,いくつか反例となる $(l,r)$ がありえます.このうち極小な区間をとると,これは交わりません.これが重要性質で,あとは比較的単純な区間 dp です.
任意に順列をとると,反例に使われない要素と極小反例区間に分割されます.この極小反例区間の集合について包除原理を考えて,dp をします.
区間 dp で,「反例区間にしない要素」「反例区間」によって区間を分割し,反例区間をとるときに $-1$ 倍の係数をかけて遷移します.反例区間にしなかった要素の個数の階乗を最後に掛け算するために,反例区間として選んだ要素数も区間 dp の状態として持つようにします.計算量は $O(n^4)$ です.
G. Jellyfish and Miku
計算量解析においてカードやイベントでの HP, damage の最大値を $k$ とします.
まず,一枚もカードを拾わない場合の計算をしておきます(簡単).
一枚以上カードを拾うとき,$10^9$ 倍されるカードを最強にすることがまず前提となります.なので,ある特別なカードを選び,そのカードを拾ってから後は強化はすべてそのカードだけの強化にあてることになります.特にこのフェーズでの戦略や獲得スコアは,このカードの獲得以前の行動と無関係です.
そこでまず,特別なカードを得た後のことを計算します.ある頂点以降について「取得する HP の総和」を固定すると,「取得する damage の総和」「取得する power および新カードの価値の総和」の組について辞書順最大化するのが最適です.よって,$\mathrm{dp}[v][x]$ を $v$ 以降で取得する HP の総和が $x$ のときの最適な結果として dp ができます.
結局,特別なカードを拾った後で得られるスコアは $O(nmk)$ 時間程度で計算できます.
あとはこれを使って前半戦です.
イベントはスルー可能であることにして,イベント $2, 3$ はカードを所持している場合にのみ行われることとします.このとき最適解において,特別なカードを得るまでのイベント $2, 3$ で得る HP, damage の総和はどちらかが $k$ 以下です.両方が $k$ 以上ならば,最初に拾ったカードを特別カードとしてそれを育てた方が得になるからです.よって $2$ 回解くことにして,HP の総和が $k$ 以下であるとします.
拾った時点でのカードを $(A,B)$ として,イベントで得る HP, damage を $(add_A, add_B)$ とします.このカードからの利得は $(A+add_A)(B+add_B)=(A+add_A)B+(A+add_A)add_B$ となります.$A+add_A$ が $O(k)$ 通りであることに注意します.
後ろから遡って計算していくことにすると,「イベントで得る力を保持」「カードを拾ったときに持っている力を配分(HP, damage それぞれについて使わなかったり使ったり)」ということになります.イベントで得る力については,$add_A$ に相当する値を dp の状態とします.$add_B$ の部分をどうするかが問題ですが,これはこの力を使うときの $A+add_A$ を固定して考えます.
つまり状態としては,
- $add_A$ をいくつ持っている
- $A+add_A$ がいくつのときに $add_B$ を使う予定である
として頂点ごとに $O(k^2)$ 状態.dp の値としては,$(A+add_A)(B+add_B)=(A+add_A)B+(A+add_A)add_B$ のうち $(A+add_A)add_B$ の部分については計算済であるようにします.
dp の状態・値の定義が出来たらあとは簡単です.特にカードがきた場合には,力を使わない,add_A のみ使う,add_B のみ使う,両方を使うなどの $4$ 通りの遷移を丁寧に実装します.
