Bootstrap

洛谷刷题-P1047 校门外的树——Python题解

题目描述

某校大门外长度为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二叉树不太熟悉,以后再战。

;