经典算法题--给指定编号区间的小朋友发糖

# 有n个小朋友,从1到n编号。
# 老师给小朋友们发糖,每次给编号在[s,r]内的每个小朋友一颗糖。
# 已知每个小朋友在最开始都是有0颗糖,老师一共发了m次糖,求此时每个小朋友各有几颗糖
#
# 输入:第一行输入n和m
# 接下来m行,每行给出2个数,s与r,标定区间
# 输出:n个整数,即老师给了m次糖以后每个小朋友各有几颗糖

 1 n,m = list(map(int,input().strip().split()))
 2 arr = [0] * n
 3 for i in range(m):
 4     s,r = list(map(int,input().strip().split()))
 5     arr[s-1] += 1
 6     if r!= n:
 7         arr[r] -= 1
 8 for i in range(1,n):
 9     arr[i] = arr[i-1]+arr[i]
10 
11 print(' '.join(map(str,arr)))

 

分析:这是个典型的区间更新+单点查询的题型

这种题目下,当在[s,r]区间内每个数加1,在左端点处+1,在右端点后一位(r+1)处减去1,如此查询点被覆盖多少次,求出前缀的和即可

posted @ 2021-12-01 00:41  大西young  阅读(87)  评论(0编辑  收藏  举报