問題. Roadwork
1次元上の原点に 人の人がいる.
番目の人は時刻
に正の方向に速度 1 で進む.ただし,道路工事が行われている場所に到達するとこれ以上歩くのを止める.道路工事は
個行われており,
番目の道路工事は時刻
から
の間に場所
で行われている.各人の歩いた距離を答えよ.ただし,無限に歩き続ける人の場合は -1 と答えよ.
制約: ,
,
,
解法
番目の人が
番目の道路工事の場所
に到達する時刻は
である.また,
に到達するときに工事中であるための必要十分条件は,
である.この不等式を整理すると
が整数であることから,
となる.したがって,
から,
番目の道路工事によって歩くことを止めてしまう人々は
のように連続する区間となる.
番目の工事によって歩くのを止めてしまう人々の区間を
と表すと,いくつかの工事でこれらの区間が交差する可能性があるが,人は最初に出会う工事中で歩くのを止めるので工事の場所で昇順に上の区間を求める.
各工事は工事の場所で昇順に整列されていると仮定する.現在 番目の工事を考える.まだ歩くのを止めていない人々の列
に対して,上の
を満たす連続する部分を探索して,その部分を
から削除する.
は
std::set で実装することによって,区間の探索を 時間ででき,区間に含まれる要素の削除を
時間でできる.したがって,全体で
時間で求まる.
計算時間:
set の使い方に手間取ったのでしっかり復習.