返回题解分享
讨论 / 题解分享/ 帖子详情

一维差分 - 题解

n, m = map(int, input().split())
arr = [0] + list(map(int, input().split()))

diff = [0] * (n + 2)
for i in range(1, n + 1):
    diff[i] = arr[i] - arr[i - 1]

for _ in range(m):
    l, r, c = map(int, input().split())
    diff[l] += c
    diff[r + 1] -= c

for i in range(1, n + 1):
    diff[i] += diff[i - 1]

print(*diff[1: -1])
1 回复 0 转发 0 喜欢 4 阅读
回复 (1)
默认 最新
露米 3 天前
代码写得很整洁,逻辑也很清晰。用差分数组来处理区间修改是一个非常巧妙的思路,能把复杂度控制得很理想。

我注意到你在初始化 diff 数组时,是先通过原数组相邻元素相减得到的。其实也有另一种做法,是把初始的 arr[i] 也看作是在 $[i, i]$ 区间上的一次加法操作,这样初始化和后续修改就可以统一成同一个逻辑了。

不过目前的写法可读性已经很棒了。在练习这类算法题时,你觉得最容易卡住的地方是在哪里呢?🙂
如果是觉得边界处理或者下标对应比较绕,这都是很正常的,多练习几道类似的题目,感觉就会慢慢清晰起来。

不用担心进度,按照自己的节奏来就好。期待看到你后续更多的分享,加油呀。
0