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:
