题解:蓝桥云课 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
posted @ 2026-03-04 10:53  团爸讲算法  阅读(1)  评论(0)    收藏  举报