以下の内容はhttps://rubikun.hatenablog.jp/entry/2024/09/19/074034より取得しました。


AGC055-D ABC Ultimatum やや別解

まわりくどいことをしていそうだが人間向けかもしれない

 

問題

atcoder.jp

 

解法

 

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

ネタバレ避け

 

 

S を時計回りに円環にした U を考えます。

このとき、U で時計回りに A,B,C の順になっているものを取れることになります。

これは、A-B のペアを N 組作って、各ペアは U で B -> A (時計回り)の間にある C を使うことができる、と言い換えることができます。

 

次に、C を無視して A と B だけについて考えます。

A を ( , B を ) としたカッコ列 T を考えると、T の累積和の min (タイブレークは左優先)から始まるように rotate することで、valid なカッコ列にできます。

実は、S をその場所で rotate したあとの A の左から i 番目と B の左から i 番目をペアにするのが C の条件を考えた時に最適なことが示せます。

 

以下、そのように S を rotate したあとのことを考えます。

左から i 番目の A の位置を l_i , B の位置を r_i とします。

 

このとき、Hallの定理より、全ての l_j <= r_i となる 1 <= i <= j <= N について、( S で l_j から r_i の間にある C の個数 ) + j - i + 1 <= N が成り立ち、かつ A,B,C が N 個ずつであることが良い文字列であることと同値であることがわかります。

C の個数の累積和配列を rui として整理すると、l_j <= r_i や i <= j は外してよく、

lma = - rui[l_i] + i の max

rma = rui[r_i] - i の max

としたときに lma + rma < N という条件になります。

 

あとは、どこで rotate するか全探索してそれぞれ dp すればトータル O(N^6) で解けます。

 

提出

atcoder.jp

 

 

 




以上の内容はhttps://rubikun.hatenablog.jp/entry/2024/09/19/074034より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14