题意

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