D - Intersecting Intervals 解説 by kyopro_friends


公式解説 より考察が少ない代わりにやや高度なデータ構造を用いる解法を紹介します。

\(r_i\) についてソートすることで、\(r_1\leq \ldots\leq r_N\) であると仮定してよいです。

このとき、\(i<j\) について、\([l_i,r_i]\)\([l_j,r_j]\) が共通部分を持つための必要十分条件は、\(l_j\leq r_i\) となることです。よって、\(j\) を固定するごとに「\(r_1,\ldots,r_{j-1}\) のうち、\(l_j\) 以上のものは何個あるか?」が解ければよく、これは \(j\) の昇順に考えることで座標圧縮+セグ木などにより \(O(N\log N)\) で解けます。

Pythonでは sortedcontainers の SortedList を用いると実装が簡単です。

実装例(Python)
(この実装例は「\(r\) の昇順」ではなく「\(l\) の降順」で区間を見る実装になっていることに注意してください。全体を左右反転すると同じになります)

from sortedcontainers import SortedList

N=int(input())
LR=sorted([tuple(map(int,input().split())) for _ in range(N)])
ans=0
S=SortedList()
for l,r in LR[::-1]:
	ans+=S.bisect_right(r)
	S.add(l)
print(ans)

投稿日時:
最終更新: