Official

E - Cut in Half Editorial by kyopro_friends


この問題は答えを二分探索することで解くことができます。

まずは次の問題を考えます。

問題1:袋の中に長さ \(A\) の棒 \(1\) 本が入っている。棒の長さを全て \(D\) 以下にするためには何回の操作が必要か?

袋の中の棒の長さとしてあり得るものは \(\frac{A}{2^k}\) の形のものに限られることから、\(\frac{A}{2^k}\leq D\) を満たす最小の整数 \(k\) を用いてこの問題の答えは、\(2^k-1\) となります。

問題2:袋の中に長さ \(A_1,\ldots,A_N\)\(N\) 本の棒が入っている。棒の長さを全て \(D\) 以下にするためには何回の操作が必要か?

各棒について独立に問題1を解くことでこの問題を解くことができます。

問題3:袋の中に \(A_1,\ldots,A_N\)\(N\) 本の棒が入っている。\(K\) 回の操作を行ったあと最も長い棒の長さは?

この問題は答えを二分探索することで問題2に帰着されます。

問題4:袋の中に \(A_1,\ldots,A_N\)\(N\) 本の棒が入っている。\(K\) 回の操作を行ったあと長い方から \(X\) 番目の棒の長さは?

まず問題3の答えを求めます。これにより、各棒がどのような長さになったかがわかります。操作後の棒の長さの種類数は高々 \(N+1\) 種類であるため、長さごとに数を数えることで答えを求めることができます。

計算の過程で登場する数は適切な実装の下、全て64bit浮動小数点数型で正確に表すことができ、誤差なく計算することができます。

posted:
last update: