题解:蓝桥云课 3291 区间更新
【题目来源】
蓝桥云课:1.区间更新 - 蓝桥云课 (lanqiao.cn)
【题目描述】
给定一个长度为n的数组a[1],a[2],...,a[n]。同时给定m个操作,每个操作有三个整形数据x,y,z。每个操作的意义就是给数组中下标为x与下标为y之间(包括x,y)的元素的值加上z。
【输入】
输入有多组数据,数据组数不大于5。每一组数据第一行有两个整数n,m(0<n,m<10^5)。第二行有n个整数,分别代表a[1],a[2],..,an的初始值。接下来就m行,每一行有3个整数x,y,z(0<x≤y≤n,0<z<10)。
【输出】
在一行内输出这个序列的所有元素的值,并且每个值之间应该以空格隔开。
【输入样例】
10 5
0 0 0 0 0 0 0 0 0 0
1 5 1
2 6 1
3 7 1
4 9 1
5 10 1
1 1
1
1 1 2
【输出样例】
1 2 3 4 5 4 3 2 2 1
3
【算法标签】
《蓝桥云课 3291 区间更新》 #差分# #枚举# #数学#
【代码详解】
#若干组测试数据
while True:
try:
n, m = map(int, input().split())
a = list(map(int, input().split()))
#处理差分数组
diff = [0]*(n+1)
diff[0] = a[0]
for i in range(1, n):
diff[i] = a[i] - a[i-1]
#进行m次操作,每次对区间[x,y]加上z
for _ in range(m):
x, y, z = map(int, input().split())
x -= 1
y -= 1
diff[x] += z
diff[y+1] -= z
#将差分数组还原成原数组
a[0] = diff[0]
for i in range(1, n):
a[i] = a[i-1] + diff[i]
print(' '.join(map(str, a)))
except:
break
【运行结果】
10 5
0 0 0 0 0 0 0 0 0 0
1 5 1
2 6 1
3 7 1
4 9 1
5 10 1
1 2 3 4 5 4 3 2 2 1
1 1
1
1 1 2
3
浙公网安备 33010602011771号