第一行输入两个整数
,用空格隔开,表示马路的长度和地铁施工区域数,满足
,
。
接下来
行,每行输入两个整数
,用空格隔开,表示第
个施工区域的起始点和终止点的坐标,满足
。
输出一个整数,表示移除所有施工区域内(包括端点)树后,剩余的树的总棵树数。
500 3 150 300 100 200 470 471
298
马路上共有棵树。施工区域 [150,300] 中含有
棵,[100,200] 中含有
棵,[470,471] 中含有
棵。三个区域的重叠部分 [150,200] 有
棵被重复移除,所以实际移除的树数为
,因此剩余
棵。
10 2 2 5 4 8
4
马路上共有棵树。区域 [2,5] 移除
棵,区域 [4,8] 移除
棵。重叠部分 [4,5] 有
棵被重复移除,所以实际移除
棵,剩余
棵。
import sys L, M = map(int, sys.stdin.readline().strip().split()) T = [1] * (L + 1) l_r=[] for _ in range(M): i = list(map(int, sys.stdin.readline().strip().split())) l_r.append(i) for l, r in l_r: for i in range(l,r+1): T[i]=0 print(sum(T))方法2(差分数组法):
import sys L, M = map(int, sys.stdin.readline().strip().split()) diff = [0]*(L+2) for _ in range(M): l, r = map(int, sys.stdin.readline().strip().split()) diff[l]+=1 diff[r+1]-=1 tree_count, count = 0, 0 for i in range(L+1): tree_count += diff[i] if tree_count == 0: count += 1 print(count)方法3(合并数组):
import sys L, M = map(int, sys.stdin.readline().strip().split()) intervals = [tuple(map(int, sys.stdin.readline().strip().split())) for _ in range(M)] intervals.sort() merged=[] for l, r in intervals: if not merged&nbs***bsp;l > merged[-1][1] + 1: merged.append([l, r]) else: merged[-1][1] = max(merged[-1][1], r) removed = sum(r - l + 1 for l, r in merged) print(L + 1 - removed)
l, m = map(int, input().split(" "))
node_lst = []
flag = 0
cnt = 0
for i in range(0, m):
x, y = map(int, input().split(" "))
node_lst.append([x, 1])
node_lst.append([y, -1])
node_lst.sort()
start_node = node_lst[0][0]
for j in range(0, len(node_lst)):
flag = flag + node_lst[j][1]
if flag == 0:
end_node = node_lst[j][0]
yc_cnt = end_node - start_node + 1
cnt += yc_cnt
if j + 1 < len(node_lst):
start_node = node_lst[j + 1][0]
print(l - cnt + 1)