Codeforces Round 1051

A. All Lengths Subtraction

$k=n,n-1,\ldots$ 順に考えます.最初の操作で,どこかに $0$ が出来るのですが,これが両端以外だと $k=n-1$ で詰みます.端に $0$ が出来る場合は,$n-1$ の場合に帰着できます.

B. Discounts

それぞれソートして,$b_i$ については小さいものから使っていきます.

C. Max Tree

すべて都合の良い側をとることができます.$2$ 頂点の間に都合の良い順序があるとき有向辺を書くと,topological sort がとれれば ok です.木の辺を有向辺にしたものは当然サイクルがないのでできます.

D2. Inversion Graph Coloring (Hard Version)

LDS が $3$ 以上だと不可能.$2$ のときは可能です.可能であることは,各頂点をその頂点までの減少列の最大長が $1,2$ のいずれかによって色を塗ればよいからです.

LDS を求めるアルゴリズムを数え上げに反映させると,

  • 長さ $1$ の減少列の末尾としてありうる最大値
  • 長さ $2$ の減少列の末尾としてありうる最大値

の組をキーとした dp ができます.これで D1 が解けると思います.

$2$ 次元 dp テーブルの各軸方向の区間和がとれれば dp が高速化できます.Fenwick Tree を $2N$ 個程度持てば D2 が解けて,計算量は $O(N^2\log N)$ です.

E. Make Good

よくあるやつ.AA, BB を置換できる問題は,AA,BB を可能な限り消去したあと,好きな位置にこれらを挿入できると思えます.

(, ) をなるべく消したあとで,好きな位置に (( や )) を挿入するのですが,前者は左端,後者は右端に挿入するほど得なので,そのパターンを調べればよいです.

F. Increasing Xor

$L$ ごとに,good となる最大の $R$ を求めるということができればよいです.

$L$ を固定します.ベクトル空間 $\mathrm{span}(A_L, A_{L+1},\ldots,A_i)$ を $\mathrm{sp}(i)$ と書くことにします.

$\mathrm{sp}(i)=\mathrm{sp}(i+1)$ であるとき,$A_{i+1}=0$ としてよいです.したがって,$A_L,A_{L+1},\ldots,A_{N-1}$ は,高々 $20$ 項にしか $0$ でない項($\mathrm{sp}(i)$ が増える項)がないとしてよいです.

$R$ の計算では,次のシミュレーションを考えます.

  • $v = 0$ から始める.
  • $i=L,L+1,\ldots$ 順に,「$w\in \mathrm{sp}(i)$ かつ $v\leq w$」となる最小の $w$ を求める.
    • なければ $R=i$ が最大である.
    • あれば $v=w+1$ と更新してシミュレーションを続ける.

これを,$\mathrm{sp}(i)$ が一定の間のシミュレーションをまとめられたら ok です.

  • $\mathrm{sp}(i)$ のうち昇順 $k$ 番目の要素を求める
  • $\mathrm{sp}(i)$ のうち $v$ 未満の個数を求める

などができればよいです.

どちらも行階段形の基底を持っていれば $O(\dim \mathrm{sp}(i))$ 時間でできます.全体では $O(N\dim^2)$ 時間かけています.

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