Educational Codeforces Round 184

A. Alice and Bob

$a<b$ のとき,$b=a+1$ にするのが最適です.

$b<a$ のとき,$b=a-1$ にするのが最適です.

この $2$ 通りをチェックして良い方を選びます.

B. Drifting Away

任意のグラフでも scc などのテクニックで解けるはずですが,略.

$*$ が $2$ 個あれば無限に続きます.それぞれの $*$ に近づくようにすればよいです.

$*$ が $1$ 個の場合,$2$ 通りの選択を試します.

$*$ がないとして解けばよいです.$…RL…$ という $2$ 文字があれば無限に続きます.これがないとき,入力文字列は $LLLLRRRRRR$ のような形としてよく,個数を数えて大きい方を出力すればよいです.

C. Range Operation

at most once ということで,$0$ 回操作というパターンは別考慮する必要があります.

累積和を使って式を立てると,$\mathrm{score}(L,R) = f(L)+g(R)$ の形で書けるため,$R$ をインクリメントしながら $\max\lbrace f(L)\mid L<R\rbrace$ を管理すればよいです.

D2. Removal of a Sequence (Hard Version)

操作を逆順にたどります.0-based index で,

  • $k=q(Y-1)+r$ とするとき,$k\leftarrow qY+r$

というような規則になります($Y=1$ は例外処理).これをそのまままわして,$N=10^{12}$ を超える場合をケアすれば D1 が解けます.

手前からシミュレーションを進めるとおおよそ $(Y-1)/Y$ 倍ずつになっていくことから,$Y$ ステップ程度で列の長さが $1/e$ 倍程度になります.なので,($q=0$ に相当する処理を正しくやれば)まず $O(Y\log N)$ 時間解法になっています.

$Y$ が大きいときは,商 $q$ が変わらないタイミングを適切にまとめれば,計算量は商の種類数 $O(N/Y)$ でおさえられます.

これらの計算量を使い分ければよいです.実装では場合分けをせず後者を想定した実装をしていれば大丈夫です.

E. Points Selection

残す点について,$2(\max x+\max y-\min x-\min y)$ を加算.というのが得点です.

得点の最大化なので,次のように条件を緩和してしまってよいです.

  • 残した点からひとつ選び $2x$ のスコアを加算.(選ぶ点は $x$ が最大であるとは限定しない)
  • 残した点からひとつ選び $2y$ のスコアを加算.
  • 残した点からひとつ選び $-2x$ のスコアを加算.
  • 残した点からひとつ選び $-2y$ のスコアを加算.

あとは例えば dp すればよいです.$4$ 種の「選び」のうちどれを行ったかという $16$ 状態を持ちます.

F. Subsequence Problem

まず列 $C$ が good であるかどうかの判定問題を考えます.

$C$ の何文字目までで $B[:i]$ までを必ず部分列にできるか,という境界を貪欲に決めていくことになります.すると,だいたい次のようなシミュレーションです.

  • $p=0$ とする.$k=0,1,\ldots,K-1$ の順に次を行う.
  • $C[p:q)$ が $A[k]$ のすべての要素を含むような最小の $q$ を求め,$p\leftarrow q$ と更新する.

FPS $f_k$ を次のように定めます:$[x^n]f_k$ は,ちょうど $k$ 文字ではじめて $A[k]$ のすべての要素をコンプリートできるような文字列の個数.

すると,答は $[x^N]\frac{\prod_k f_k}{1-Mx}$ である.$\frac{1}{1-Mx}$ は,$k=K-1$ までのステップが終わったあと自由に文字を付け加える部分です.

$f_k$ の FPS の積として書けます.$a=|A[k]|$ として,コンプリートしている文字数が $0, 1, \ldots, a-1$ のときに文字種をひとつ増やすまでの部分に分解します.すると,$\frac{(a-i)x}{(1-ix)}$ のようなものの積として $f_k$ が書けます.

結局,$1$ 次式の総積や FPS 逆元の計算を $O(\sum |A[k]|)$ 個の $1$ 次式についてすればよいことになります.

$n = \sum |A[k]|$ として $O(n\log^2n+N\log N)$ 時間で解けます.$A[k]$ の要素は入力を受け取る必要すらありません.

また $|A[k]|\leq 5$ という制約を使えば,定数個の fps pow と畳み込みになるので $O(n\log n+N\log N)$ 時間などでも解けるはずです.

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