题意
给出一个长度为n的数组和m次修改,每次修改都要把a[l~r]加上k,输出全部操作完成之后的数组
数据范围是n,m<=1e5,a[i]<=1e9
思路
考虑使用差分数组,对于数组a构造差分数组d,使得d[i] = a[i] - a[i-1]
那么对于每一次操作,给区间[l,r]全部加上k以后,a[l] - a[l-1] 就增加了k,因为a[l]变大了但是a[l-1]没变,所以相当于d[l]+=k 。同理,a[r]变大了但是a[r+1]没变,相当于d[r+1]变小了k
最后再把差分数组还原即可
Go代码
package main import ( "fmt" ) func main() { var n,m int fmt.Scan(&n,&m) a := make([]int,n+1) d := make([]int,n+1) //差分数组 for i := 1; i <= n; i ++ { fmt.Scan(&a[i]) d[i] = a[i] - a[i-1] } for i := 1; i <= m; i ++ { var l,r,k int fmt.Scan(&l,&r,&k) d[l] += k if r + 1 <= n { d[r+1] -= k } } for i := 1; i <= n; i ++ { a[i] = a[i-1] + d[i] fmt.Printf("%d ", a[i]) } }