import sys # for line in sys.stdin: # a = line.split() # print(int(a[0]) + int(a[1])) def func1(): nm= list( map(int,input().split())) n=nm[0] m=nm[1] nums=list(map(int,input().split())) for i in range(m): cmd=list(map(int,input().split())) l=cmd[0] r=cmd[1] k=cmd[2] #print(nums) for index in range(l-1,r): nums[index]+=k #print(nums) ret =str(nums[0]) for i in range(1,len(nums)): ret=ret+" "+str(nums[i]) print(ret) #func1() def func2(): nm= list( map(int,input().split())) n=nm[0] m=nm[1] nums=list(map(int,input().split())) # 创建差分数组 #print("nums",nums) d=[0]*n d[0]=nums[0] for i in range(1,n): #d.append(nums[i]-nums[i-1]) d[i]=nums[i]-nums[i-1] #print("差分",d) for i in range(m): cmd=list(map(int,input().split())) l=cmd[0] r=cmd[1] k=cmd[2] #print(nums) #print(l,r,k,d) d[l-1]+=k # left 开始位置 加上k if r <n: # 避免右端点超出范围 d[r]-=k # right+1 位置减去k #print(nums) # 还原数组 res=[0]*n res[0]=d[0] #print(res) for i in range(1,len(d)): res[i]=res[i-1]+d[i] # 拼接 #ret =str(res[0]) #for i in range(1,len(res)): # ret=ret+" "+str(res[i]) ret=" ".join(map(str,res)) print(ret) func2() """ func1:直接遍历每个修改操作的区间,时间复杂度为 O (m*n),当 n 和 m 达到 1e5 时会超时。 func2 : 使用差分数组 原数组 :a=[1,2,3] k=4 执行操作输入 left=1, riht=2, k=4(即给区间 [0, 1] 的元素加 4): 差分数组: diff=[1,1,1] 具体做法是: 假设坐标从0开始 差分数组修改:只需在差分数组的两个端点进行操作: d[left] += k:表示从位置 l 开始的所有元素都增加 k。 d[right+1] -= k:表示从位置 r+1 开始的元素取消增加 k 的效果,从而将修改限制在区间 [left, right] 内。 还原原数组:修改完成后,通过前缀和运算即可得到修改后的原数组。 修改差分数组: d[0] += 4 → d = [5, 1, 1] d[2] -= 4 → d = [5, 1, -3] 还原原数组(前缀和): a[0] = d[0] = 5 a[1] = d[0] + d[0] = 5 + 1 = 6 a[2] = d[0] + d[1] + d[2] = 5 + 1 - 3 = 3 最终数组为 [5, 6, 3],与直接遍历修改的结果一致,但操作复杂度从 O (n) 降为 O (1) 应用场景 差分数组适用于处理多次区间修改,单次查询最终结果的问题,例如: 频繁对数组区间进行增减操作。 游戏中的区域伤害计算。 航班座位预订统计等。 代码实现关键步骤 初始化差分数组:根据原数组计算相邻元素的差值。 处理区间修改:对差分数组的两个端点进行 O (1) 操作。 还原结果:通过前缀和运算将差分数组转换为最终数组。 这种方法特别适合处理大规模数据的区间修改问题,时间复杂度为 O (n + m),其中 n 是数组长度,m 是操作次数。 测试用例 3 2 1 2 3 1 2 4 3 3 -2 其中 3 3 -2 测试 r =3 时候是边界 注意判断 """