对于一个A的空闲时间段 [a, b] 和一个B的空闲时间段 [c, d],我们要找的是:t取何值时,将 [c+t, d+t] 与 [a, b] 有非空交集?

在草稿纸上简单画图模拟一下,可以得到 \mathbf{t\in[d-a,b-c]}

当然,题目中还有一个限制:那就是B的起床时间要在 [l, r]之内。因此将 [d-a, b-c] 再与 [l, r] 取交集,得到最终的区间为

\mathbf{t\in[max(l,d-a),min(r,b-c)]}

遍历每一对A和B的空闲时间段,得到了 p*q 个区间。此时使用区间合并这一问题的思路,最终得到符合条件的起床时间数量。

时间复杂度:O( pq*log(pq) )

from collections import defaultdict
def solve():
    p, q, l, r = [int(x) for x in input().split()]
    A, B = [], []
    intervals = []
    for _ in range(p):
        A.append([int(x) for x in input().split()])
    for _ in range(q):
        B.append([int(x) for x in input().split()])
    for a, b in A:
        for c, d in B:
            s, e = max(l, a - d), min(r, b - c)
            if l <= s < e <= r:
                intervals.append((s, e))
    intervals.sort()
    ans = 0
    a = b = l
    for s, e in intervals:
        if s <= b:
            b = e
        else:
            ans += b - a + 1
            a, b = s, e
    ans += b - a + 1
    print(ans)

while 1:
    try:
        solve()
    except:
        break