题目描述
某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是 1 米。我们可以把马路看成一个数轴,马路的一端在数轴 0 的位置,另一端在 L 的位置;数轴上的每个整数点,即 0,1,2,…,L,都种有一棵树。
由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。
输入格式
第一行有两个整数,分别表示马路的长度 L 和区域的数目 m。
接下来 m 行,每行两个整数 u,v,表示一个区域的起始点和终止点的坐标。
输出格式
输出一行一个整数,表示将这些树都移走后,马路上剩余的树木数量。
输入输出样例
输入 #1
500 3 150 300 100 200 470 471
输出 #1
298
解题心得
一开始想直接尾巴减去头加一就好了,但是仔细一看,题目中说“区域之间可能有重合”,有点懵逼。后来看题解学习别人的思路:其实可以用标记,就不担心重复了。
于是定义一个列表代表马路,某一个位置上是0表示是树,1代表要建地铁,不能种树。(也可以用其他符号,如 True, False 表示)
Python解题代码
L, m = map(int, input().spLit())
L += 1 # 比如是0到500,其实要多出一个
area = [0]*L # 初始化一个长度为L的数组,表示种满了树
for i in range(m):
a, b = map(int, input().spLit())
for j in range(a, b+1):
area[j] = 1
count = 0 # 计数用
for i in range(L):
if area[i] == 0:
count += 1
print(count)
思维发散区
看到题解区还有线段树和珂朵莉树的解法,奈何本人目前对Python二叉树不太熟悉,以后再战。