このアルゴリズムの問題について質問があります。問題を貼り付けてから、現在の考えと解決策を確認します。
N (up to 100,000)
、として定義された線分があります[(x1, y1), (x2, y2)]
。ここで、x1 < x2
およびy1 < y2
(たとえば、線分は正の勾配を持っています)。端点であっても、線分が接触したり交差したりすることはありません。最初のセグメントには(x1, y1) = (0, 0)
。各セグメントを、人が登らなければならない2Dの丘として想像してください。
人(0, 0)
は最初の丘から始めて着陸します。人が丘に着陸するときはいつでも、彼は最後まで登ります、それは(x2, y2)
まっすぐにジャンプします。彼が別の丘(セグメントのどこかに)に着陸した場合、プロセスは続行されます。彼はその丘を登ってジャンプします。丘がもうない場合、彼は倒れ-INFINITY
、プロセスは終了します。各丘は、ポイントを含むがポイントを含まない(x1, y1) -> (x2, y2)
と見なす必要があります。これにより、人が上の位置で上から落下した場合は丘に着陸しますが、から落下した場合は丘に着陸しません。上記の。(x1, y1)
(x2,
y2)
x = x1
x = x2
目的は、彼が触れた丘の数を数えることです。
私の現在の考え
x軸に沿って平面を横切る線をスイープすることを考えています。各セグメントは、BEGINイベントとENDイベントで構成されます。線分の始まりに遭遇するたびに、それをセットに追加します。線分の終わりに遭遇するたびに、それをセットから削除します。そして、現在の丘の終点に到達したら、着陸できる最も高い丘のセットを確認する必要があります。ただし、セット内にN個のエントリが存在する可能性があるため、これをすばやく確認する方法を判断する方法がわかりません。また、別の丘にジャンプした後は、各セグメントの傾斜が異なる可能性があるため、これらの順序が変更されます。この違いを説明する方法がわかりません。
何かご意見は?