Codeforces Round 1084

A. Eating Game

$a_i$ が $\max(a)$ に等しいときに勝てます.開始位置も一番有利な場所を選ぶとよいです.

それ以外だと勝てません.常に max だった人と比べて不利なことが示せます.

B. Deletion Sort

初期状態が単調増加の場合は自明です.そうでないとき,残り要素数が $1$ になるまで非単調増加を保てます.

減少する $2$ 数に注目し,これが残り続けるように操作すればよいです.

C. Specialty String

アスタリスクについては,削除して詰めると思いましょう.

隣接する等しい $2$ 文字を好きに削除することを可能な限り繰り返した結果は,操作順に依存しません.というのが有名です.実装は左から見ていって,同じ文字が並んだ瞬間に削除するという実装をして,空になるか否かが答です.

証明は結構難しいやつだと思います.「任意の削除順」と「先頭に近い位置から貪欲に削除する削除順」の結果が一致することを帰納法で示すことができます.

D. Portal

$\mathcal{O}$ の外側は境界位置のシフト,内側はサイクリックシフトです.

外側を $A$,内側を $B$ とすれば,「$B$ を好きにサイクリックシフトして $A$ の好きな位置に挿入」ということになります.

E. Divisive Battle

初期状態が単調増加の場合は自明に Bob です.

次に素べきでない要素があると Alice です.初手でその要素の最小素因数を $p$ とし,$xp$ と分解すると,この部分が増加列になることはありません.

最後にすべてが素べきであるとします.簡単のため $a_i>1$ として説明します($a_i=1$ の部分の結論はほとんど同じです).

各 $a_i$ が素数 $p_i$ のべき乗であるとして,$p_1\leq p_2\leq \cdots$ のときに Bob 勝ちです.操作不可能になった時点で単調増加だからです.そうでないとすると Alice 勝ちです.$p_i>p_{i+1}$ というところがあれば,$a_{i+1}$ を初手で $p_{i+1}x$ と分解すると,以降では $p_{i+1}$ が直前より小さい状態が維持され続けます.

F. Mooclear Reactor 2

まず追加アイテムがないとします.$k\leq y+1$ のものを,$k$ 個以下貪欲にとる.というパターンをすべての $k$ で試せばよいです.

追加アイテムに対応するには,すべての $k$ について

  • $k\leq y+1$ のものを $k$ 個以下貪欲にとる.
  • $k\leq y+1$ のものを $k$ 個未満貪欲にとる.

というパターンについて事前計算を行ってよけばよいです.

G. Operation Permutation

operation は,add, multiply の $2$ 種だと思えます(加法逆元を足す,乗法逆元をかける).

それぞれの add および初項それぞれについて,ANS への寄与を考えればよいです.初項はすべての multiply をかければよいです.

add はその何倍が答に寄与するかは add される値によらないので,add 1 の寄与の期待値が分かればよいです.

multiply のうち add 1 の後ろに来る $n$ 個の部分集合を固定したときの確率は,適当な階乗や二項係数でかけます.その値を部分集合にわたって足せばよいです.結局,$\prod (1+a_ix)$ の形の多項式総積を求めておけばよいことになり,$O(n\log^2 n)$ 時間で解けます.

H. Six Seven

次のようにします.

– 足す値を $\bmod 6$ で決める.すべて $6$ の倍数にできなければ不可能.可能なら $0$ 以上 $5$ 以下の値を足してしまう.以降 6 ずつしか足せないという問題を解く

– 足す値を $\bmod 7$ で決める.これは,$0,6,12,18,24,30,36$ の $7$ 通りを全探索する.以降 42 ずつしか足せないという問題を解く

  – この時点で $7$ の倍数にならなかった $a_i$ は以降無視する.

– 足す値を $\bmod 36$ で決める.$42$ を $5$ 回以下足して,すべて $36$ の倍数にできなければ不可能.可能ならそれを足してしまい,以降 252 ずつしか足せないという問題を解く

– 足す値を $\bmod 49$ で決める.$252$ を $6$ 回以下足す $7$ 通りを全探索する.すべて $49$ の倍数にできなければ不可能.可能ならそれを足してしまい,以降以降 1764 ずつしか足せないという問題を解く

こういう要領でやっていきます.

ある探索から次の探索 $7$ 個への分岐がありますが,「$7^k$ の倍数にならなかったら無視」ということになっているおかげで,再帰の $k$ 段目での数列の要素数の総和が $n$ でおさえられます.

あとは再帰の深さ(あるいは答の値)がおさえられるかです.再帰の $k$ 段目では,すべての値が $\pmod{42^k}$ で等しくなります.このことから,$\log_{42} \max a$ 程度の再帰深さで数列の要素が $1$ 種類になり,終了します.

CodeForces
スポンサーリンク
シェアする
maspyをフォローする
maspyのHP
タイトルとURLをコピーしました