一、大学里的树木要打药
问题描述
教室外有 N 棵树,根据不同的位置和树种,学校要对其上不同的药。
因为树的排列成线性,且非常长,我们可以将它们看作一条直线给他们编号。
树的编号从 0∼N−1且N<1e6 。
对于树的药是成区间分布,比如 3∼5 号的树靠近下水道,所以他们要用驱蚊虫的药,20∼26 号的树,他们排水不好,容易涝所以要给他们用点促进根系的药 ⋯诸如此类。
每种不同的药要花不同的钱。
现在已知共有 M 个这样的区间,并且给你每个区间花的钱,问最后这些树木要花多少药费。
输入描述
每组输入的第一行有两个整数 N和 M。N 代表马路的共计多少棵树,M 代表区间的数目,N 和 M 之间用一个空格隔开。(1<=N<=1000000,1<=M<=100000)
接下来的 M 行每行包含三个不同的整数,用一个空格隔开,分别表示一个区域的起始点 L 和终止点 R 的坐标,以及花费。
输出描述
输出包括一行,这一行只包含一个整数,所有的花费。
输入示例
500 3
150 300 4
100 200 20
470 471 19
输出示例
2662
问题分析
这题直接151*4+101*20+2*19=2662不就好了。但还是先用用差分吧。
刚开始这500个树所需的钱均为0,所以其差分数列(对原列表中的每个数,都让其减去前面一个数,其中第一个数让其不变)也均为0。对于后面input的m行数,一行一行处理,让差分数列在第l个数加上所需的钱,在第r+1个数减去所需的钱,最后做一步差分的逆运算,以此就可以实现在区间[l,r]中每个数加上所需的钱。
代码示例
n,m=map(int,input().split())
ls=[0 for i in range(n)]
for i in range(m):
l,r,q=map(int,input().split())
ls[l]+=q
ls[r+1]-=q
for i in range(1,n):
ls[i]+=ls[i-1]
print(sum(ls))
二、大学里的树木要维护
题目描述
教室外有 N 棵树,根据不同的位置和树种,学校已经对其进行了多年的维护。因为树的排列成线性,且非常长,我们可以将它们看作一条直线给他们编号。
树的编号从 1∼N且N<1e6。由于已经维护了多年,每一个树都由学校的园艺人员进行了维护费用的统计。
每棵树的前期维护费用各不相同,但是由于未来需要要打药,所以有些树木的维护费用太高的话,就要重新种植。由于维护费用也呈区间分布,所以常常需要统记一个区间里的树木的维护开销。
现在园艺人员想知道,某个区间内的树木维护开销是多少。共计 M个区间需要查询。
输入描述
每组输入的第一行有两个整数 N和 M。N 代表马路的共计多少棵树,M 代表区间的数目,N 和 M 之间用一个空格隔开。(1<=N<=1000000,1<=M<=100000)
接下来的一行,包含 N 个数 ,分别表示每棵树的维护费用,每个数之间用空格隔开。
接下来的 M 行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点 L 和终止点 R 的坐标。
输出描述
输出包括 M 行,每一行只包含一个整数,表示维护该区间的开销。
输入示例
10 3
7 5 6 4 2 5 0 8 5 3
1 5
2 6
3 7
输出示例
24
22
17
问题分析
这道题可以用前缀和来做,对于输入的数据(每棵树的维护费用),先在最前面加一个0(方便之后l,r的对应),之后创设一个sum列表,其中summ[i]=summ[i-1]+a[i],那么我们要求的从第1棵到第5棵树的维护费用之和就可以表示成summ[5]-summ[0]。
代码示例
n,m=map(int,input().split())
a=[0]+[int(i) for i in input().split()]
s=0
summ=[0]
for i in range(1,n+1):
s+=a[i]
summ.append(s)
for i in range(m):
l,r=map(int,input().split())
res=summ[r]-summ[l-1]
print(res)
标签:杯备赛,示例,差分,蓝桥,summ,ls,区间,input,维护费用
From: https://blog.csdn.net/weixin_71409897/article/details/137419690