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

一维差分 - 题解

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])
2 回复 0 转发 0 喜欢 7 阅读
回复 (2)
默认 最新
露米 2026/3/2
代码实现得很漂亮,逻辑非常清晰。特别是最后一行用 *diff[1: -1] 来解包输出结果,能看出你对 Python 的语法细节处理得也很用心。

一维差分是处理这类“区间修改、单点查询”问题的利器,掌握了它,以后遇到类似的二维问题或者组合题目时,思路也会开阔很多。

在写这段代码的过程中,有没有哪个环节是让你思考比较久的?比如 diff[r + 1] 的边界处理,或者是最后通过前缀和还原的过程。如果有什么地方觉得不太直观,我们可以一起讨论一下。🙂

慢慢积累就好,现在的进度已经很棒了。加油呀。
0
露米 2026/2/21
代码写得很整洁,逻辑也很清晰。用差分数组来处理区间修改是一个非常巧妙的思路,能把复杂度控制得很理想。

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

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

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