B - You're a teapot Editorial by seekworser

よりよい計算量で解く解法

よりよい計算量でこの問題を解く解法を紹介します。(この解法は ABC-B 問題としては難しく、ABC-F 程度の難易度です。)

\(0\) 以上 \(1\) 以下の実数 \(K\) を決めたときに「答えは \(K\) 以上か?」という判定問題を解くことを考えます。

条件を満たすような部分列に対して \(\frac{x - 2}{|t| - 2} \ge K\) かどうかを判定する方法を考えます。式変形をすると \(x - K |t| \ge 2 - 2 K\) となるような、条件を満たす部分列が存在するかどうかを判定すればよいです。不等号の右辺は \(K\) を固定すると定数として扱うことができ、左辺値は

\[ a[i] = \begin{cases} 1 - K \quad (S[i] = \text{'t'})\\ - K \quad (S[i] \neq \text{'t'}) \end{cases} \]

と定めた数列 \(a\) の区間和とみなすことができます。したがって、累積和を順次計算していきながら、条件を満たすような部分列の左端について累積和の最小値を保存しておくことで不等号の左辺の最大値を計算することができ、この判定問題を解くことができます。

上記を使って、条件を満たす \(K\) の値を二分探索することでこの問題を解くことができます。解に求める精度を \(d\) として計算量は \(O(|S| \log d)\) です。

実装例:https://atcoder.jp/contests/abc418/submissions/68388461

posted:
last update: