题解 | #【模板】差分#

【模板】差分

https://www.nowcoder.com/practice/4bbc401a5df140309edd6f14debdba42?tpId=230&tqId=2022327&ru=/exam/oj&qru=/ta/dynamic-programming/question-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D230

import sys



s = input().split()
n,q =int(s[0]),int(s[1])
data =input().split()
data = list(map(lambda x:int(x),data))

i=1
querylist=[]

while i<=q:
    querylist.append(input().split()
    )
    i+=1
difference = [i for i in range(len(data))]

difference[0]=data[0]

#计算出差分数组
for i in range(1,len(data)):
    difference[i]=data[i]-data[i-1]




for x in querylist:
    #print(x)
    l,r,k=int(x[0]),int(x[1]),int(x[2])
	#更新差分数组,l-1的值和r+1的值,如果r+1-1等于k,不用更新r了就
    difference[l-1]+=k
    if r==len(difference):
        pass
    else:
        difference[r+1-1]-=k

data[0] =difference[0]
#print(difference)
#原数列的第i项等于差分数列的前i项和
for i in range(1,len(difference)):
    data[i]=data[i-1]+difference[i]

for x in data:
    print(x,end=" ")

全部评论
对于数列an, a2-a1=b2; a3-a2=b3 a4-a3=b4 ... an-an-1 =bn 那么 上边的式子左边加左边,右边加右边 an=b1+b2 +.....n
点赞 回复 分享
发布于 2023-03-03 21:44 广东
问题转化为通过求差分数组的前n项和求原序列的第n项,转化为求经过q次变化的差分数组
点赞 回复 分享
发布于 2023-03-03 21:48 广东
差分数组每次只改变俩个值 l的值和r+1的值
点赞 回复 分享
发布于 2023-03-03 21:49 广东

相关推荐

点赞 评论 收藏
分享
11-11 14:21
西京学院 C++
Java抽象练习生:教育背景放最前面,不要耍小聪明
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务