Codeforces Global Round 31

A. Carnival Wheel

周期 $L$ 以下なので $L$ 回動かして試します.

B. Ashmal

一般に $X<Y$ と $L+X+R<L+Y+R$ は同値ではないですが,$|X|=|Y|$ なら同値です.

よって $n+1$ 回目以降の操作を決め打ったときに $n$ 回目まででできている文字列は小さい方がよいです.なので貪欲でよいです.

C. XOR-factorization

topbit から順に処理します.偶数個または奇数個の要素に $1$ を置くということになります.

現時点での $A$ を保持して,置くことが可能なインデックスを列挙します.このうち小さい方の $A$ から優先して置いていけばよいです.

これは,一回でも「$1$ を置かなかった」という選択をした要素は以降常に「$1$ を置ける」状態になっているからです.

D. Insolvable Disks

各円について,両隣の中心を含まないという制約を課します.

$[L,R]$ における最適解とは,この制約下でこの範囲同士の円が交わらないもののうちスコアが最大ということにします.

区間 $[1,p]$ の最適解が $p-1$ になる(つまり全部接するようにできる)ような最大の $p$ をとります.このとき

  • $[1,p]$ の最適解
  • $[p+1,N]$ の最適解

をマージした解を考えます.まず,このように左右独立にとった解はちゃんと全体でも valid になります.この解において円 $p,p+1$ が交わってしまうというのが心配ですが,それは $p$ の最大性に矛盾します.よってこれらの円は交わりません.

よって上の解は実現可能です.

これより高いスコアを得るには $[1,p]$ および $[p+1,N]$ で上の解と同じスコアを実現した上で $p,p+1$ が接するようにするしかありませんが,$p$ の最大性よりそれは不可能です.

よって「最大の $p$ を求める」「残り $[p+1,N]$ で独立に解く」ということを反復すれば解法になります.

最大の $p$ を求めるところが問題ですが,円 $[1,2,…,i]$ を配置したときの $i$ 番目の円の半径としてありうるものがどのようなものかを順に求めていけばよいです.これは開区間になるため inf, sup の $2$ つの値を持つようにします.

E. No Effect XOR

$r-l\leq 2$ のときは解けます.以下 $r-l\geq 3$ とします.

$l,l+1,…,r$ のうち偶数が $a$ 個,奇数が $b$ 個あるとします.

$a\neq b$ のとき.このとき,偶数は偶数に対応し,奇数は奇数に対応する必要があって,よって $x$ は偶数です.$x$ の上位 bit を考えます.

例えば $[3,7]$ としましょう.このとき,奇数のことを考えると上位 bit では $[1,3]$ を保つ必要があります.偶数のことを考えると上位 bit では $[2,3]$ を保つ必要があります.これらを比べると,$1$ を保つ必要があるため,上位 bit は $0$ しかありえません.

結局 $a\neq b$ ならば $x=0$ しかないことが分かります.

$a=b$ のとき,奇数に対応する上位 bit の区間を $I_1=[l_1,r_1]$ とし,偶数に対応する上位 bit 区間を $I_2=[l_2,r_2]$ とします.

$I_1=I_2$ ならば,再帰的に解いた場合の $2$ 倍を答とすればよいです.そうでないとき,これらは互いにひとつ平行移動した状態です.

例えば $[l,r]=[3,8]$ とすると,$I_1=[1,3]$,$I_2=[2,4]$ のようになります.

$x$ の偶奇によらず,差集合部分が差集合部分にうつらなくてはいけません.この時点で $x$ の候補が $O(1)$ 個になり,それらを判定します.

F2. Control Car (Hard Version)

丁寧に dp をやると

  • $(i,j)$ に到達した.$(i,j)$ の右上隅と左下隅の頂点からの壁の方向も決めてある.
  • 右上隅から下方向に壁があるか否か
  • 左下隅から右方向に壁があるか否か

を状態として,実現確率を持つ dp ができます.$4HW$ 個の値を求めることになります(空間は $4H$ 程度でよい).

これで各 $(i,j)$ について,$(i,j)$ で停止するときの確率が求まります.これは適当なテーブルに格納します(空間 $HW$).重要な性質として,この確率は $(i,j)$ のみから決まり,$H,W$ には決まりません.

よって,適当な累積和テーブルを作っておけば F1 が解けます.

$n$ を固定すると,dp 遷移は $O(n)$ 状態の行列累乗の形で書けるため,答えは $m$ について C-recursive で,F2 ではこれを補間して答を求めればよいです.

G. Balance

まず $a=(a_0,\ldots,a_{n-1})$ に対して「すべての subsequence に対する balance の総和」がどうなるかを計算します.

$a_i$ ごとの寄与係数を求めます.$a_i$ の左にある要素数を $l$,右にある要素数を $r$ とするとき,

$$\sum_{i,j}\binom{l}{i}\binom{r}{j}\cdot \frac{i+1}{i+j+1}$$

が知りたいということになります.これは $$\sum_{i,j}\binom{l}{i}\binom{r}{j}\cdot (i+1)x^{i+j}$$ の $[0,1]$ での定積分です.被積分関数を式変形すると,

$$
\begin{aligned}
& (1+x)^r\left(\sum_{i}\binom{l}{i}(i+1)x^{i}\right) \\
& =(1+x)^r\left((1+x)^l+\sum_{i}\binom{l}{i}(i)x^{i}\right) \\
& =(1+x)^r\bigl((1+x)^l+x\cdot l(1+x)^{l-1}\bigr) \\
& =(1+x)^r\bigl((1+x)^l+l(1+x)^lx\cdot l(1+x)^{l-1}\bigr) \\
& =(1+l)(1+x)^{l+r}-l(1+x)^{l+r-1}
\end{aligned}
$$

となります.よって,寄与係数はこれを $[0,1]$ で積分した値

$$(1+l)\frac{2^{l+r+1}-1}{l+r+1}-l\cdot \frac{2^{l+r}-1}{l+r}$$

です.これはやばそうです.列の長さ $n=l+r+1$ は $\text{mod}$ の倍数でないことが保証されていますが,$l+r$ はそうではないからです.

しかし本問では大丈夫です.我々の扱う列 $a$ は常に回文です.よって,$(l,r)$ を入れ替えたものの平均をその要素の寄与係数としてもよいです.すると寄与係数は

$$(1+n)\frac{2^n-1}{n}-(2^{n-1}-1)$$

となります.特に寄与係数が要素ごとに等しいので,総和,$n$,$2^n$ あたりを求めておけばクエリに答えられることになります.

クエリを処理するために,だいたい要素数がバランスをとるように列を $L,R$ に分けて扱います.それぞれの vector の末尾に列の中央が来るような感じにします.タイプ 1 のクエリは末尾の pop,タイプ 2 のクエリは,現在の要素 $c$ を $xc$ に置換したあとでどちらかに $x$ を push という形になります.

クエリで push された値の履歴を持っておき,push する値については push した時刻を持っておきます.つまり,列を組 $(x,t)$ の列として管理して,「要素 $x$ の左側について時刻 $t$ 以降の置換をすべて行うことで正しい列になる」という状態にします.

すると insert クエリは自明になります.pop するときには,末尾の要素に対する置換処理を遅延評価して,$t$ が最新になった時点で pop します.

今回は個数や総和だけを管理すればよいため,pop されるものの値くらいしか要らないです.insert に上手く対応できればよいので,実際にはもうちょっと強く,小さい $k$ について $\sum i^ka_i$ を管理したりもできると思います(はじめこれをやる問題なのかと思いましたが $k=0$ だけでした).

H2. Bug Is Feature (Conditional Version)

まだ

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