题意
给出一个长度为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])
}
}

京公网安备 11010502036488号