公式

J - Median Operations 解説 by Dispersion


まず、区間長 \(3\) に対する操作のみを考えるとして十分です。

固定された \(k\) に対する判定方法を考えます。 \(k\) 未満の数字を 0 に、\(k+1\) 以上の数字を 1 に置き換えた文字列 \(B\) を考えます。 また、整数 \(i\)A[i] = k を満たすものとします。

01 列 \(S\) に対して、問題文中の操作を繰り返すことで達成可能な (0 の個数) \(-\) (1 の個数) の最小値と最大値をそれぞれ \(m(S), M(S)\) とします。 このとき、 \(A\) を長さ \(1\) の数列 \((k)\) にできる 必要十分条件は \(m[B[0,i)] + m[B[i+1,N)] \leq 0 \leq M[B[0,i)] + M[B[i+1,N)]\) です。

\(m(S)\) の効率的な求め方を述べます。 111 に対する操作は必要なく、000 に対する操作回数を最大化すべきです。特に、000010 に対する操作を可能な限り繰り返すことで得られる文字列が \(m(S)\) を達成する文字列になります。\(M(S)\) についても同様です。

最後に、\(k=1, 2, \ldots, N\) に対する判定方法を説明します。 以上のアルゴリズムは segtree に乗せることができます。具体的には segtree の各ノードにおいて、その区間に対応する文字列の prefix, suffix 高々 \(3\) 文字を持てばよいです。以上より、 \(O(N\log{N})\) time でこの問題を解くことができます。

投稿日時:
最終更新: