Codeforces Round 1048

A. Cake Assignment

逆順に操作していけばよいです.一意に決まっていって,$2$ で割れる回数が増えていくことから初期状態に到達します.

B. Antiamuny Wants to Learn Swap

321 avoding sequence(あるいは LDS 2 以下)ということになります.なぜならばそのような $3$ 要素のうち右端と左端の距離が最小であるものをとると,転倒を解消するスワップの繰り返しでその $3$ 要素を隣接させられて,$2$ 種類目の操作を転倒を $3$ 減らす形で使えてしまうからです.逆にそのような $3$ 要素がなければ転倒を $3$ 減らす操作ができるタイミングは発生しません(操作 2 は高々 1 回までなので).

$R$ をインクリメントしながら,同じ $R$ に対するクエリにまとめて答えます.このためには,$A_1,\ldots,A_R$ に対する長さ $3$ の減少列であって左端が最も大きいものを適当な方法で求めておけばよいです.

C2. Maple and Tree Beauty (Hard Version)

longest common subsequence といっていますが,longest common prefix としてよいです.prefix を使わないパターンがあるとして適当なスワップ操作で使う場所の深さを小さくするという議論で示せます.

葉の深さを $d$ とします.長さ $k$ が達成できるかどうかですが,$k\leq d+1$ が必要です.あとは深さ $k$ までのところで同じ深さのところに同じ値を書いて,目標の個数分布にできるかどうかです.bitset を持って subset sum の dp しながら,ある区間に true があるかを見ていけばよいです.

D. Antiamuny and Slider Movement

すべての $i$ について独立に解きます.制約が小さい.

$i$ を固定すると,

  • $x=a_i$ で初期化.
  • 「$x:=v$」「$x:=\min(x,v)」「$x:=\max(x,v)」という $3$ 種のクエリを並べる.

ということになります.

さらに適切な座圧を行って,次のことを $O(Q)$ 回計算することにします:「最終的な位置が $x$ 以上になるような操作列は何通りありますか?」

$x$ を固定してこの問題を考えると,$x$ 以上の座標を $1$,その他を $0$ として扱えばよくなります.$\mathrm{chmin}(x,1)$ と $\mathrm{chmax}(x,0)$ は無視,その他のクエリはすべて代入操作として扱えます.代入操作のうち最後に来るものはどれかだけに興味があるので,順列が条件を満たす確率が簡単に計算できます.

適切にやると $O(NQ)$ 時間程度になると思いますが,毎回雑な座圧で $O(NQ\log Q)$ 時間使っても大丈夫です.

E2. Determinant Construction (Hard Version)

私は E1 を経由せず直接 E2 という感じでした.

tridiagonal に作ることを考えます.

det は dp で計算できます.各行から $1$ つずつ選ぶ方法について考えて,「$i$ 行目までを選んだ時点で $[0,i+1]$ 列目のうち $i,i+1$ のどちらかだけまだ選んでいない」という $2$ 状態を持つようにします.

私はこの 2 種を実装したのですが,考えるまでもなく後者はスワップと前者でしたね(終了後に気づいた).

$(\pm 1,\pm 1)$ からスタートしてこれらの操作で和が $N$ の状態に持っていけばよいです(コンテスト中はこれも $(N,x)$ を作ろうとしていてコスト $1$ を損していた).

$(N,x)$ を互除法のように戻していって $(\pm 1,\pm 1)$ にするときのコストが目的の値以下になれば成功です.このような $x$ は乱択で簡単に見つかるようです.

F. Ode to the Bridge Builder

まだ.

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