差分、二维差分、树上差分

一维差分:

给你一个数组a[1] ~ a[n],有Q个操作,每一操作给定 l , r , x 表示 [l, r] 区间所有的数都加上 x, 让你求最后a[1] ~ a[n] 最后各自是多少,要求用 O(n) 复杂度 完成。

设定一个差分数组C[] , 对于每一次操作 c[l] += x , c[r + 1] -= x.   最后对C 做一遍前缀和。C[i] 最后就得到 a[i] 这个数变化了多少。

a[1] ~ a[n] 最后各自就是  a[i] + C[i].

 

二维差分:

和一维差分差不多, 每一次给定 左上角 (x1,y1),右下角 (x2,y1),x

每次操作  C[x1][y1] += x ,  C[x2 + 1][y2 + 1] += x ,  C[x1][y2 + 1] -= x , C[x2 + 1][y1] -= x;

然后做一遍二维前缀和。

 

树上差分:

思想和一维二维差分一样,只不过最后做和的时候不同。树上差分的做和  C[i] =  C[i] + (其子树的所有节点的C).也就用dfs再跑一次树 求和。

还有一点值得注意的就是,点权差分和边权差分有些许不同。

例如都是改变 u, v 这一条链上的。

点权:每一次 C[u] += val,  C[v] += val , C[lca(u,v)] -= val , C[Fa_LCA(u,v)] -= val.

边权:C[u] += val , C[v] += val , C[lca(u,v)] -= 2 * val.

至于为什么会有差异,用手画一画就理解了。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值