15天大厂真题带刷 - ZT21【模板】差分 | Go

【模板】差分

https://www.nowcoder.com/practice/4bbc401a5df140309edd6f14debdba42

题意

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

#牛客创作赏金赛#
15天大厂真题带刷Go题解 文章被收录于专栏

15天大厂真题带刷Golang题解

全部评论

相关推荐

深夜书店vv:腾讯是这样的,去年很多走廊都加桌子当工区
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务