对于一个A的空闲时间段 [a, b] 和一个B的空闲时间段 [c, d],我们要找的是:t取何值时,将 [c+t, d+t] 与 [a, b] 有非空交集?
在草稿纸上简单画图模拟一下,可以得到 。
当然,题目中还有一个限制:那就是B的起床时间要在 [l, r]之内。因此将 [d-a, b-c] 再与 [l, r] 取交集,得到最终的区间为
遍历每一对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

京公网安备 11010502036488号