buyoh.hateblo.jp

残念な競技プログラミング参加者による学習記録

Code Festival Team Relay (Parallel) - D 数直線

雑でごめんなさい

問題

cf18-relay-open.contest.atcoder.jp

数直線上に N 個の点があり、i 番目の点の座標は x_i です。また、N 個の整数 w_i が与えられます。

次の条件を満たす点 p の座標を求めてください。条件を満たす点が複数ある場合は、最も座標が小さいものを求めてください。

条件: 「1≤i≤N を満たす整数 i に対する (p から点 i までの距離) × w_i の最大値が最小になる。」

解説

「1≤i≤N を満たす整数 i に対する (p から点 i までの距離) × w_i」 の最大値 を f と置くと,次のような線形計画問題っぽいものになる.

minimize f
subject to w_i × |p - x_i| ≦f   for all   i in {1..N}

f を二分探索で求めたい.f を適当な値に固定すると,それぞれの i について,次のような p の区間が定まる.

p ≦ x_i + f / w_i
p ≧ x_i - f / w_i

全ての i について,共通の p の区間を求め,その区間が存在するかどうか確かめる二分探索が得られる.

以上で最適な f が見つかった.得た f から再び p の区間を計算して,最小値が答え.

cf18-relay-open.contest.atcoder.jp