競プロ典型90問「017 - Crossing Segments(★7)」の別解になります。 本質的には同じことをやっていたらすみません。
問題
問題文
演習上に $N$ 個の点があり、時計回りに $1,2,\dots,N$ と番号づけられています。 また、 $M$ 本の線分があり、線分 $i$ は点 $L_i$ と 点 $R_i$ を結んでいます。
線分 $s, t$ が端点以外で交わるような、 $(s, t) \ (1 \leq s < t \leq M)$ の組の数を求めてください。
https://atcoder.jp/contests/typical90/tasks/typical90_q より引用
制約
- $N, M \leq 3 \times 10^5$
別解
考察
円周を $N$ 頂点の重みなし無向サイクルだとみなします。 そして、「線分 $i$ の幅」 を $\min(R_i - L_i, N - (R_i - L_i))$ で定義します。 これは、円周を $N$ 頂点のサイクルとみなしたとき、頂点 $L_i$ から $R_i$ の最短経路上のパスの数に等しいです。
さて、幅が最小の線分 $i$ を考えます。 線分 $j$ が線分 $i$ と端点以外で交わるとき、以下が成り立ちます。
- 「頂点 $L_i$ から $R_i$ の最短経路」上($L_i, R_i$を除く)に線分 $j$ の端点が存在する。
一方で、幅の最小性より、以下も成り立ちます。
- 「頂点 $L_i$ から $R_i$ の最短経路」上($L_i, R_i$を除く)に端点を持つ線分について、もう片方の端点は「頂点 $L_i$ から $R_i$ の最短経路でない方のシンプルパス」上($L_i, R_i$を除く)にある。
上述の2つの事実から、少し考えると、以下の2つの個数が等しいことがわかります。
- 線分 $i$ と端点以外で交わる線分の個数。
- 「頂点 $L_i$ から $R_i$ の最短経路」上にある端点の個数。
解法
以上の考察を用いると、次の方法で正しい答えが得られることがわかります。
$\mathrm{ans}$ を $0$ とする。
以下を線分が無くなるまで繰り返す。
- 幅が最小の線分を1つ選び、 $i$ とする。
- 「頂点 $L_i$ から $R_i$ の最短経路」上にある端点の個数を、 $\mathrm{ans}$ に加える。
- 線分 $i$ を削除する。
$\mathrm{ans}$ を出力する。
上記は、セグメントツリーを使うことで、 $\Theta(M (\log M + \log N))$ 時間で計算することができます。
ソースコード
|
|
提出: https://atcoder.jp/contests/typical90/submissions/37691943