青達こんにゃくが公式div 2 div2に初めて登場A c Ac ind i v 2cは5問あり、小こんにゃく史上最高の出来でもあり、この後私のcfも黄色になるかも知れません。
A. フリップフロップサム
質問の意味: a - ia - i が与えられた場合a —— i配列、重みは 1 または -1 のみです。隣接する 2 つのビットを選択して反転します (1 から -1、-1 から 1)。取得できる最大合計はいくらですか、n <= 2 e 5n<= 2e5n<=2e5. _ _
アイデア: 隣接するすべてのビットを徹底的に列挙し、それらを反転して最大合計を見つけます。
コード
B. 禁じられた順列の
タイトルの意味: nnの長さを指定するとn順列配列pppは長さをmm単位で示しますmおよび異なる要素aaa、配列はすべて1 <= i < m 1 <= i < m1<=私<m满足pos ( ai ) < pos ( a ( i + 1 ) ) < pos ( ai ) + d pos(a_i) < pos(a_(i_+1_)) < pos(a_i) + dpos ( _ _私は)<pos ( _ _(私+1))<pos ( _ _私は)+d,pos ( x ) pos(x)pos ( x )はxx を意味しますaaのx値配列の位置、次の操作を実行できるようになりました。ppp配列の隣接する項目、 aaを作成するには何回の操作を実行できますか配列は適切です。n <= 2 e 5 、 m <= 2 e 5 、 ai <= nn <= 2e5 、 m <= 2e5 、 a_i <= nn<=2e5 、_ _メートル<=2 e 5 、a私は<=n。
アイデアは、不良配列の状態を破壊することです。彼が要求しているのは、すべての隣接する位置が満たされなければならないことであることがわかりました。満たされない最小コストを考慮します。2 つのケースを考えてみましょう。a ( i + 1 ) a( i+1)(私は+1)移动到 a ( i ) a(i) a(i)前面或者 a ( i + 1 ) a(i+1) (私は+1 ) a(i) + da(i) + dに移動a (私)+dの後、コストは最小値になる可能性があります。
コード
C. 柔軟な文字列質問の意味: nn
の長さを 2 つ教えてくださいnのaaa、bbb、値を( l , r ) (l , r)( l 、r )を満たす要件の数( l <= r 、 l >= 1 、 r <= n ) (l <= r 、 l >= 1 、 r <= n)( l<=r 、私>=1 、r<=n )は、 a ( l , r ) = = b ( l , r ) a(l , r) == b(l , r) の場合にのみ要件を満たします。a ( l 、r )==b ( l ,r )文字列 a の l から r までの部分文字列は、文字列 b の l から r までの部分文字列と同じです。QQ
を定義しますQスタック、次のことができます、aa文字列ai a_iある私はQQに載せてねQパイルにai a_iを入れますある私は任意の文字に置き換えますccc、QQQヒープ内の異なる文字列の数はkkKタイプ、数回の操作後に文字列の最大値を見つけます。タイトルは文字列aaa、bbbに現れる文字列のタイプはk <= 10 、 n <= 2 e 5 k <= 10 、 n <= 2e5k<=10 、n<=2e5. _ _
アイデア: 10 のバイナリ列挙を考え、すべての正当な状態を列挙し、その状態に対応する文字列の最大値を見つけます。時間計算量O ( 2 k ∗ n ) O(2 ^k * n)○ (2k∗n )
コード
D. 柔軟な文字列
タイトルの意味を再確認: nnの長さを 2 つ指定してくださいnのバイナリ文字列aaa、bbb、文字列の値は0、1 0、10 、1 、各演算に対して添え字ii をランダムに選択できます。i,然后把 a i ai ai反転(0が1になる、1が0になる)(0が1になる、1が0になる)( 0 to 1 , 1 to 0 )、2 つの文字列を同じにするために必要な演算の予想数を求めます。
アイデア: 問題の変換を検討し、問題をai aiに変換するai和 b i bi 同じbiの数はkkk 、異なる数はn − k nkとして推定できます。n−k。それからアイアイを
入れますai和 b i bi 同じbiの数はkkkは状態kkk、状態kkkから状態nnn dp [ k ] dp[k]の予想される演算d p [ k ]回。
1. ワンオペレーション、ai aiai和 b i bi biの添字は同じです。以前は同じでしたが、反転すると異なり、状態はk − 1 k-1k−1 .
2. ワンオペレーション、ai aiai和 b i bi biの添字は同じではありません。反転により、異なる添字は同じ添字になり、k + 1 k+1k+1 .
式は次のように推定できます。 dp [ k ] = 1 + k / n ∗ dp [ k − 1 ] + ( n − k ) / n ∗ dp [ k + 1 ] dp[k] = 1 + k/ n * dp [k - 1] + (nk)/n * dp[k+1]d p [ k ]=1+k / n∗d p [ k−1 ]+( n−k ) / n∗d p [ k+1 ]この式を見てください。dp [ k − 1 ] と dp [ k + 1 ] dp[k - 1] と dp[k + 1] が
式から外れてd p [ k−1 ]とd p [ k+1 ]のような式では答えは見つかりません。
角度を変換して考えます、状態kkから考えますkから状態k+1 k+1k+1希望する希望の操作dp [ k ] dp[k]d p [ k ]回、答えはdp [ k ] dp[k]mmからd p [ k ]mからn − 1 n-1n−1の合計、原因はmmmからnnまでn、最初にdp [ m ] dp[m]d p [ m ]はm + 1 m+1になりますメートル+1、その後dp [ m + 1 ] dp[m+1]d p [ m+1 ] はm+2 m+2になりますメートル+2 ...などコストdp [ n − 1 ] dp[n-1]d p [ n−1 ]からnnn。
状態遷移を考えてみましょう。
1. ワンオペレーション、ai aiai和 b i bi biの添字は同じではありません。反転により、異なる添字は同じ添字になり、k + 1 k+1k+1 の場合、操作数は 1 です。
2...一度操作して、ai aiai和 b i bi biの添字は同じです。以前は同じでしたが、反転すると異なり、状態はk − 1 k-1k−1、状態k − 1 k-1k−1はk+1 k+1になりますk+1はdp [ k − 1 ] dp[k-1]を通過する必要がありますd p [ k−1 】動作は状態kkk、次にdp [ k ] dp[k]d p [ k ]の操作は状態k + 1 k+1k+1 の場合、演算数は1 + dp [ k − 1 ] + dp [ k ] 1 + dp[k - 1] + dp[k] です。1+d p [ k−1 ]+d p [ k ]。
式は次のようになります。 dp [ k ] = ( n − k ) / n + k / n ∗ ( 1 + dp [ k − 1 ] + dp [ k ] ) dp[k] = (n - k)/n + k /n * (1 + dp[k - 1] + dp[k])d p [ k ]=( n−k ) / n+k / n∗( 1+d p [ k−1 ]+d p [ k ])
簡略化を考慮すると、簡略化プロセスは次のようになります。
最終的な式は次のようになります。dp [ k ] = n / ( n − k ) + k / ( n − k ) ∗ dp [ k − 1 ] dp[k] = n / (n - k) + k / (n - k ) * dp[k - 1]d p [ k ]=n / ( n−k )+k / ( n−k )∗d p [ k−1 ]
この式を転送するだけです。初期値dp [ 0 ] = 1 dp[0]=1d p [ 0 ]=1、0 から 1 への転送は 1 回である必要があり、同じものが空であるため、異なるものから選択することしかできず、その後、m − ( n − 1 ) m - (n -1)メートル−( n−1 )のdp [ k ] dp[k]d p [ k ]とすることができます。
コード
E. 木が倒れた!タイトル: nn
のサイズの木をあげますnの木、各点の値はai aiai、qqq回の問い合わせ、各問い合わせはrrrはuuのルートですこれらの点の重み XOR 和が最大になるようにuサブツリー内のいくつかの点を選択し
アイデア: オフラインにすることを検討してください。すべての問い合わせは質問に変わりますrrr为根, u u uサブツリーの最大の XOR 合計の形式。その後、dfs dfs をdf s、最初のパスdfs dfsdf s は1 を根とするsz[u] sz[u]sz [ u ]の最大 XOR 合計dfs dfsdf s はrootdp dpdpのアイデアはuuによって維持されていますu は、 u をルートとする他のノード サブツリーの最大 XOR 合計 (線形基底) であり、すべてのクエリをオフラインで処理します。
原則: 2 つのサブツリーをルートとして維持されるすべてのサブツリー情報。唯一の違いは 2 つのサブツリー間のパス情報 (ルートのツリーの方向が異なる) です。その後、最初に 1 つのサブツリーの情報を維持することを検討できます。その後、次を使用します。DFS DFSdf s機能 (通過経路情報を維持できる) を使用すると、この問題を解決できます。
原則のグラフィックやテキストは、理解を容易にするために今後更新されますが、線形ベース結合は基本的な内容ですので、ここでは当面詳しく説明しません。
コード