Codeforces Round 743

div2 only は省略.

スポンサーリンク

A. Book

topological 順に,何週目で達成できるかを計算できます.

B. Xor of 3

総 xor は不変量なのでこれが $0$ であることが必要です.

$n$ が奇数ならば必要条件のもと達成可能です.まず $2i, 2i+1, 2i+2$ 番目に $i=0,1,2,\ldots$ と操作することで $2$ 個ずつ等しい状態にしていきます:$a, a, b, b, c, c, d, d, e, e, e$.総 xor が $0$ のとき末尾 $3$ つは $0$ です.このあと後ろから順に $x,x,0 \to 0,0,0$ をやっていけばよいです.

$N$ が偶数とします.操作の累積 xor への影響を考えると $\ldots,a,b,c,d,\ldots\to \ldots,a,d,a,d,\ldots$ の形です.特に奇数個 xor 全体の集合や偶数個 xor 全体の集合は単調減少です. 特に奇数個 xor であって $0$ であるものの存在が必要です($n$ が奇数の場合にはこれが全体 xor の条件でした).

必要条件のもと左 $a$ 個,右 $b$ 個の xor が $0$($a,b$ は奇数)であるとして,$n$ が奇数のときの手法をそれぞれの部分にやればよいです.

C. Paint

run length encoding しておきます.すると $N-1$ 箇所の要素境界があって,現在そこが異色になっています.

ある境界 2 つが,はじめて操作されるときに同時に連結されるとうれしそうです.このようなことが起こる場所を結んでいくと,「交わらない」または「包含」であるような区間たちになります(左側を開きカッコ,右側を閉じカッコとしてカッコ列).

逆にこのような区間 $k$ 個を選んだときに,操作回数 $(N-1)-k$ で単色にすることができます.木構造の葉側から順に操作するということをやればよいです.

あとは基本的な区間 DP です.

D. Bridge Club

大きさ $k$ の最大重み二部マッチングを求める問題です.各頂点次数は $n$ です.

グラフの大きさが非常に大きいためこれを減らします.

$k-1$ 個のマッチングを固定したときに残りの選び方を考えると,価値の高い方から見て選ぶことに失敗する回数が $2n(k-1)$ 回程度しかありません.したがって辺重みが上位から $2n(k-1)+1$ 個以外は使われることはありません.そのように頂点や辺を減らした上で最小費用流をとればよいです.

E. Polygon

二分探索判定問題を考えます.「面積 $t$ 以上のものちょうど $k+1$ に分けられるか?」という判定問題です.ここで判定問題を,「面積 $t$ 以上のものを $k+1$ 個以上作れるか?(すべての領域を使いきる必要はない)」としてもよいです.

すると,ある区間に対する結果について「面積 $t$ 以上のものを $a$ 個とりきった.最後に面積 $b$ の部分が余っている」という形で最適なものがあります.これで区間 DP します.

F. Stations

各 $i$ から送信できる範囲を $[i,a_i)$ として,初期状態は $a_i = i+1$ です.

更新としては $a_i$ に対する 1 点更新と区間 chmin によって書けます.求値は,$[i,a_i)$ に対して $+1$ するというのをすべての $i$ でやったときに $[l,r)$ での和を求めるというものです.

sum, chmin 等で良く知られている SegTree Beats のようにすると,multiset $\{\{a_i\}\}$ の変化が $O(Q\logQ)$ 回の

  • $(a,b,cnt)$: cnt 個の a を b に変更する

によって書けます.セグメント木への chmin によって,セグメント木の各ノードでの値の種類数について,「更新失敗する代わりに種類数が $1$ 以上減る」「種類数が減らないが更新成功」のどちらかが起こるからです.

すると,すべての $i$ に対して $[i,a_i)$ に $+1$ したときの列は,$O(Q\log Q)$ 回の区間加算によって変更できます.答は区間加算と区間和のできるデータ構造で処理します.

Beats パートは通常のように,max, 2nd max, count of max などを持てばよいです.

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