Codeforces Round 1083

A. Simons and Making It Beautiful

先頭が $N$ になるようにスワップするとスコアを最小化できます.

B. Simons and Cakes for Success

素因数分解して素数ごとに考えると,$k$ は $p$ をいくつ以上含むという条件がでてきます.

(結局「いくつ以上」は単に $1$ 以上なはず)

C. Simons and Posting Blogs

逆順に見た上でそれぞれ reverse などすると言い換え問題文は,「結合して,同じ値の $2$ 回目以降を捨てる.結果を辞書順最小化」というものです.

結合して辞書順最小化,と思うと文字列の $X+Y<Y+X$ のソートのような何かが登場しそうな気もしましたが,あまり関係ありません.

とりあえず単に辞書順最小のもの $X$ を採用しようとします.これが最適でなくなるとすると,結合の場合には $X$ を prefix にもつ $Y$ が別の候補ということになります.しかしこの出現を unique する設定では,$Y$ を使うパターンは $X\to Y\to \cdots$ に置き換えられるので,考えなくてよいです.

結局辞書順 min を使うことを確定させてよいです.あとは既出の要素を削除して解きます.

$x=\sum l_i$ とすれば,「既出要素削除」は $O(x^2)$ です.ある文字を削除するときに残り文字を一回ずつ見るので.

辞書順 min ですが,これも一回あたり $O(x)$ で全部で $O(nx)$ です.「$2$ 個を比較して大きい方を捨てる」ことを繰り返しますが,比較には短い方の長さの計算量しかかかりません.「$2$ 個を比較して,大きい方を捨てる.捨てた方の長さをコストと見なす.」とすればよいです.

D. Simons and Beating Peaks

max について,「左側全削除」または「右側全削除」をするしかありません.これで再帰的に解きます.

結局 Cartesian Tree の高さになると思いますがあまり気にせず解きました.

E. Simons and Dividing the Rhythm

$rev(S)$ を reverse とします.

文字列の border とは,prefix でも suffix でもあるような部分文字列のことでした(空でないことと全体と一致しないことも要求します).結論として,borderless substring への分割を数えればよいです.

まず,borderless substring への異なる分割からは異なる文字列が得られることを示します.

$T=X+A+B+\cdots=Y+C+D+\cdots$ を $2$ つのそのような分割とし,$|X| < |Y|$ とすれば

  • $X$ は $Y$ の prefix
  • $rev(X)$ が $rev(Y)$ の prefix つまり $X$ が $Y$ の suffix

より $X$ は $Y$ の border となって,borderless への分解であることに矛盾します.よって $X=Y$ で,これを繰り返すと示せます.

次に,任意の操作結果について,同じ操作結果を得るような borderless substring への分割がとれることを示します.

これは border を持つ文字列を操作結果を保つように分割していくという方針で示せます.(例えば $abcab \to bacba$ という操作は $ab,c,ab$ に分割して操作するというものに置き換えられます.)

$T$ が $S$ の border で,$|S|=n,|T|=m$ であるとします.このとき $S$ は周期 $p=n-m$ を持ちます.

$m\leq n/2$ なら $S=TUT$ と書けるので,$rev(S)=rev(T)rev(U)rev(T)$ と操作を分割できます.

$n/2 < m$ のときは,周期 $p=n-m$ の何倍かを引いた $m-kp$ も border となります.このことから,border として常に長さ半分以下のものがとれるので,上の議論が使えます.

F. Simons and Dividing the Rhythm

感覚的には,各頂点の次数が偶数であるような境界線によって,図形全体が内外の $2$ 種に分かれます.

グラフ理論と幾何学的に示します.境界線はすべての頂点の次数が偶数なので,サイクルの和として書けます.サイクルは平面上の単純多角形で,ある点から半直線方向に進んで交わる回数の偶奇は一定です(進む方向を微小に変化させるタイプの議論で正当化可能).この偶奇で内外を定義すればよいです.

あるいは問題文の定義を利用できて,そちらの方が初等的でいいかも.ちょうど「上方向,左方向の境界線の個数の偶奇」の概念が定義されています.

この偶奇が全マスで一致することを示したいのですが,不一致なマスが存在したとしてその辞書順最小のところに注目すると,矛盾します(左のマス,左上のマス,上のマスでは一致していたことから次数奇数の点が発生).

言い換え問題文.

  • 各マスを $0$ または $1$ とする.
  • $0,1$ の境界となる辺を境界線として採用.

さらに言い換えると,

  • 各マスを $0$ または $1$ とする.
  • 各マスについて「上,左の辺の値をプラス,右,下の辺の値をマイナス」とした辺の値の総和を各マスの重みとする.
  • $1$ とした全マスの重み和がスコアとなる.

という形になります.まずここは境界線にできない,という制約を無視すれば,重みと $0$ の $\max$ を足していくと答になります.境界線に関する制約は,「あるマスは $0$ としてください」「こことここは同じ $0,1$ にしてください」というタイプの制約です.連結成分ごとの重み和などを求めればよいです.

G. Simons and Diophantus Equation

まだ

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