首页 > 试题广场 >

校门外的树

[编程题]校门外的树
  • 热度指数:1209 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}某校大门外长度为 L 的马路上有一排树,每两棵相邻的树之间的间隔都是 1 米。我们可以把马路看成一个数轴,马路的一端在数轴 0 的位置,另一端在 L 的位置;数轴上的每个整数点,即 0,1,2,\dots,L,都种有一棵树。

\hspace{15pt}由于马路上有一些区域要用来建地铁,这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。请你计算将这些树都移走后,马路上还有多少棵树。

输入描述:
\hspace{15pt}第一行输入两个整数 L,M,用空格隔开,表示马路的长度和地铁施工区域数,满足 1 \leqq L \leqq 100001 \leqq M \leqq 100

\hspace{15pt}接下来 M 行,每行输入两个整数 l_i,r_i,用空格隔开,表示第 i 个施工区域的起始点和终止点的坐标,满足 0 \leqq l_i \leqq r_i \leqq L


输出描述:
\hspace{15pt}输出一个整数,表示移除所有施工区域内(包括端点)树后,剩余的树的总棵树数。
示例1

输入

500 3
150 300
100 200
470 471

输出

298

说明

马路上共有 L+1=501 棵树。施工区域 [150,300] 中含有 151 棵,[100,200] 中含有 101 棵,[470,471] 中含有 2 棵。三个区域的重叠部分 [150,200] 有 51 棵被重复移除,所以实际移除的树数为 151+101+2-51=203,因此剩余 501-203=298 棵。
示例2

输入

10 2
2 5
4 8

输出

4

说明

马路上共有 11 棵树。区域 [2,5] 移除 4 棵,区域 [4,8] 移除 5 棵。重叠部分 [4,5] 有 2 棵被重复移除,所以实际移除 4+5-2=7 棵,剩余 11-7=4 棵。

备注:

l,m = map(int,input().strip().split())

regin = []
for _ in range(m):
    a,b = map(int,input().strip().split())
    regin.append((a,b))

totals = l +1
remove_trees = overlaps = 0

removed = [False] * (l+1)

for (a,b) in regin:
    for i in range(a,b+1):
        if not removed[i]:
            remove_trees += 1
            removed[i] = True
        else:
            overlaps += 1

remain = totals - remove_trees
print(remain)

发表于 2025-06-07 21:42:21 回复(1)
n,M=map(int,input().split())
L=[1]*(n+1)
for _ in range(M):
    l,r=map(int,input().split())
    for i in range(l,r+1):
        L[i]=0
print(sum(L))
发表于 2025-06-24 16:16:05 回复(0)
用set
l, m = map(int, input().split())
s = set()
for i in range(m):
    a, b = map(int, input().split())
    s.update(range(a, b+1))
print(l + 1 - len(s))

发表于 2025-06-18 11:36:36 回复(0)
L, M = map(int, input().split())
S = []
for i in range(M):
    temp = list(map(int, input().split()))
    S.append(temp)

S.sort(key=lambda x: x[0])
# print(S)
L = L+1
for i in range(M):
    if i==0:
        L = L-(S[i][1]-S[i][0]+1)
    else:
        if S[i][0]<=S[i-1][1]:
            if S[i][1]<S[i-1][1]:
                S[i][1] = S[i-1][1]
            else:
                L = L - (S[i][1]-S[i-1][1])
        else:
            L = L-(S[i][1]-S[i][0]+1)
print(L)
发表于 2025-06-18 01:35:36 回复(0)
l,m = map(int,input().split())
l1 = list(range(l+1))
exclude = set()
for i in range(m):
    m1,m2 = map(int,input().split())
    exclude.update(range(m1, m2 + 1))
l1 = [x for x in l1 if x not in exclude]
print(len(l1))
感觉用去重简单点
发表于 2025-06-04 13:33:01 回复(0)
示例答案错了
发表于 2025-05-22 17:36:41 回复(0)