步骤
1.先将所有区间按左端点排序
2.从前往后扫一遍,维护当前正在合并的区间[st, ed]
3.依次检查每个区间[l, r]
,
若 l > ed
,将[st, ed]
加入 ans , 更新st = l,ed = r
若 l <= ed
,更新ed = max(ed, r)
时间复杂度 O(nlogn)
模板
https://www.acwing.com/problem/content/description/424/
code:
python
l, m = map(int, input().split())
grid = [list(map(int, input().split())) for _ in range(m)]
grid.sort()
p = grid[0]
st, ed = p[0], p[1]
sum = 0
for p in grid[1:]:
if ed < p[0]:
sum += ed - st + 1
st, ed = p[0], p[1]
else:
ed = max(ed, p[1])
sum += ed - st + 1
print(l + 1 - sum)
小试牛刀
https://www.acwing.com/problem/content/1345/
code:
python
n = int(input())
grid = [list(map(int, input().split())) for _ in range(n)]
grid.sort()
p = grid[0]
st, ed = p[0], p[1]
ans, res = 0, 0
for p in grid[1:]:
if ed < p[0]:
ans = max(ans, ed - st)
res = max(res, p[0] - ed)
st, ed = p[0], p[1]
else:
ed = max(ed, p[1])
ans = max(ans, ed - st)
print(ans, res)
真题演练
二分答案 + 区间合并
AC_code:
python
import sys
input = sys.stdin.readline
inf = float('inf')
n, length = map(int, input().split())
grid = [list(map(int, input().split())) for _ in range(n)]
def check(mid):
a = []
for pos, t in grid:
if t > mid:
continue
l = max(1, pos - (mid - t))
r = min(length, pos + (mid - t))
a.append((l, r))
a.sort()
if not a:
return 0
st, ed = a[0][0], a[0][1]
if st != 1:
return 0
for p in a[1:]:
if ed + 1 < p[0]:
return 0
else:
ed = max(ed, p[1])
if ed != length:
return 0
return 1
l, r = 1, 10**18
while l <= r:
mid = (l + r) // 2
if check(mid):
ans = mid
r = mid - 1
else:
l = mid + 1
print(ans)
END
如果有更多问题或需要进一步的帮助,可以在评论区留言讨论哦!
如果喜欢的话,请给博主点个关注 谢谢