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)$ 時間かけています.