Codeforces Round 411

A. Find Amir

重み $0$ の辺と重み $1$ の辺だけで連結にできます.

B. Minimum number of steps

各 b の右にある a の個数を $x$ としたときに $2^x$ の総和が不変量になります.操作終了時にすべての b について $x=0$ であることから終了時の b の個数が分かり,操作回数が分かります.

C. Ice cream coloring

$\max s_i$ 色は必要です.これは達成できます.根側から順に topological 順に見て,ある点でまだ色の決まっていない種類のものがあればそれに mex を割り当てるようにしていきます.

D. Expected diameter of a tree

まず $Q=1$ として考えます.それぞれの成分について,中心,半径や各頂点から中心までの距離を求めておきます.半径や距離は半整数になるかもしれないので実際には $2$ 倍したものを保持します.

それぞれの半径が $r_1,r_2$ で中心からの距離 $d_1,d_2$ の点を結んだときの直径は,$\max(2r_1,2r_2,r_1+r_2+d_1+d_2+1)$ となります.

このような値の総和は,各成分について適当な累積和テーブルを求めておき,$d_1$ をループすれば $O(r_1)$ 時間で計算できます.

本問全体の計算量について.まず各連結成分について適当な前計算を行うために $O(N)$ 時間かかります.クエリでは,$O(\min(r_1,r_2))$ 時間で答えますが,同じペアに対する計算はメモ化して一度しか行わないようにします.

$r_1<\sqrt{N}$ となるクエリに対する計算量は $O(Q\sqrt{N})$ 時間,$r_1\geq \sqrt{N}$ となるクエリについては対となる $r_2$ が $\sqrt{N}$ 個以下しかないことから,$O(\sum r_1\sqrt{N}) = O(N\sqrt{N})$ 時間となり,合計 $O((N+Q)\sqrt{N})$ 時間になります.

E. The same permutation

全体で偶置換になるようにする必要があることから,$N\equiv 0, 1\pmod{4}$ が必要です.

$N=4n$ として条件を満たすことを確かめます.$N-4$ の場合の構築を延長するという方法で帰納的に構築します.$N-4$ 頂点の $2$ 個ずつに分けて,それぞれと追加 $4$ 頂点の部分の二部グラフで適切に操作することで達成できます.

$N=4n+1$ として条件を満たすことを確かめます.$4n$ の場合の構築を少し変化させます.

やはり $2$ 頂点ずつに分けます.追加頂点を $v$ として,各ペア $(a,b)$ をスワップする操作を,$(a,v), (a,b), (b,v)$ をスワップする操作に置き換えると条件を満たすことができます.

F. Fake bullions

難読….各時点で $0$ 個または $1$ 個を所有というようなことが書かれていますが,$1$ 個の本物を持っている人がコピーを製造するのはどのタイミングなのかよくわからない.「コピーを製造して渡す」を 1 手順だと思えばよいのだろうか.結局この文章を完全に無視すると読解がうまくいきはじめる気がします.

最終的な読解としては,

  • トーナメントの辺 $i\to j$ があるとき,任意の $x$ に対してグループ $i$ の $x\bmod s_i$ 番目の人からグループ $j$ の $x\bmod s_j$ 番目の人に辺があると思う.
  • 入力で $1$ が書かれている人から到達可能な人を $1$ に変化させる操作を自由に行える.
  • $1$ の個数が各グループのスコアとなる.
  • スコアが上位の $a$ グループ(タイブレイクは自由)から自由に $b$ グループを選ぶ.選ばれた $b$ グループとしてありうるものを数えよ.

です.まずは,各人が $1$ になれるかを求めるのが最初のステップです.

強連結成分分解します.強連結成分の中で $s_v$ の gcd を $g$ とすれば,ある人から到達可能な人の添字は $\bmod g$ で不変で,逆に $\bmod g$ で定数であるようなところには到達可能であることが分かります.

強連結成分はパス状に並べることができて,パスの手前から順にありうる添字集合を $\bmod g$ で求めていきます.強連結成分を一つ飛ばしにする利点もなく,$i$ 番目の成分から $i+1$ 番目の成分に直接進むような移動だけを考えればよいです.これで $1$ にできる人が全部決定できます.

残る問題は次のようになります:列 $L_i, R_i$ が与えられる.$x_i\in [L_i,R_i]$ を選び,$x$ が大きい方から $a$ 個の $i$ を選び,さらにその中から $b$ 個の $i$ を選ぶ.選ばれる添字集合としてありうるものを数えよ.

まず,$x_i$ が選ばれた状態で $b$ 元集合 $S=\{i_1,\ldots,i_b\}$ が条件を満たしうるかを考えます.これは,$\min\{x_i\mid i\in S\}$ 以下であるような $x_j$ ($j\notin S$)が $n-a$ 個以上あるというのが条件になります.

$x_i$ が選ばれていない状態で判定を考えると,$i\in S$ については $x_i=R_i$,$j\notin S$ については $x_j=L_i$ とした場合を考えれば良いことがわかります.

あとは簡単で,$R$ が昇順になるようにソートし,$\min S$ を固定して数えることが可能です.

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