Codeforces Round 182

A. Yaroslav and Sequence

$2$ 回の操作で $2n-2$ 個の要素が flip した状態にできます.$4$ 回の操作で $2$ 個の要素が flip した状態にできます.

これを繰り返すと,好きな偶数個を flip することが可能です.$n$ が奇数のときはさらに $1$ 回操作することで,好きな $1$ 個を flip することができます.よって好きな個数を自由に flip できます.$n$ が偶数のときは総積が不変量となって,flip されるものの個数は常に偶数です.

flip できるものの個数が決定できました.flip する個数を固定して考えると,ソートして手前側を $-1$ 倍した場合が最大です.

B. Yaroslav and Time

これは制約が $a_i\leq d$ という制約が超重要です.移動は必ず残り時間を減らし,そのため同じ頂点を $2$ 回使えたとしてもそのような移動は必ず損してしまい,path を探す問題を walk を探す問題に緩和できます.

このことから,二分探索内部で適当な最短路問題と同様に解けます.やはり上の制約から,ある点で補充した時点で持てる量の最大値を,値が大きい方から計算できます.

C. Yaroslav and Algorithm

入力はなんでもよく,受け取らなくても解けます.雰囲気説明.

まず $s$ が空文字であるようなコマンドによって種類 A のカーソルを作ります.カーソルを右端まで移動させ,種類 B のカーソルに変化させます.

そのあとは,種類 B のカーソルがある位置に $8$ 以下の値が書かれていればインクリメントして終了.$9$ があれば $0$ に書き換えてカーソルを左にずらします.

種類 A のカーソルを “??”,種類 B のカーソルを “?” としてこれを実装できます.

D. Yaroslav and Divisors

$r$ をインクリメントしながら,$[l,r)$ に対する答 $ans[l]$ を計算するためのデータを管理します.

ペアの左側インデックスのところに $+1$ しておけば,クエリに答えるのは区間和です.必要なことはすべて Fenwick Tree で処理できます.

E. Yaroslav and Arrangements

まず列を与えたときの good array の数え上げについて考えます.

各 $i,i+1$ の間に無向辺を書いて,その辺の個数にしたがってサイクルを作るというような数え上げになります.無向辺は偶数個書いて,両方向に同じ回数の有向辺として使うことになります(特に列の長さは偶数です).

例えば $1, 2, 3, 4$ の $4$ つの値が登場するとします.各区間の双方向に $a, b, c$ 本の有向辺を書くとします.

BEST theorem より,このグラフの eulerian cycle の個数は,$abc\cdot (a-1)!(a+b-1)!(b+c-1)!(c-1)!$ のように数えられます.

ただし,これは辺ラベル込みで数えています.またサイクルに使う最初の辺もひとつ選んで固定した場合です.

目的のものを数えるために,まず最初の辺は $a$ 本からひとつ選ばれているとします.それ以外の辺ラベルの区別をなくすために,これを $(a-1)!a!b!b!c!c!$ で割ります.

$\dfrac{abc(a-1)!(a+b-1)!(b+c-1)!(c-1)!}{(a-1)!a!b!b!c!c!}=\dfrac{(a+b-1)!(b+c-1)!}{(a-1)!b!(b-1)!c!}$

のような式になって,二項係数の積として計算できます.あとは,列の長さ・種類数・列の個数の 3 つ組をキーとして dp すればよいです.

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