树上差分

树上差分

  树上差分是我认为是LCA的一种应用方式,由于树的特性,我们在求解树上差分时是能从底向上求解,这样树上差分的适用范围有了一定的限制,例如我们在求解过程中只有子树和的统计才是有意义的,单纯统计一条边上的和是没有任何意义的,这是我们在更改时就只更改了从节点到LCA这一区间的值,对于从别的分治来的统计和,只能代表从这从这一分支向上传递的更改。
  树上差分适用于这种问题——对树上的一段路径进行操作,并询问某个点或某条边被经过的次数,此时我们可以利用树上差分实现懒惰更改,并在最终求结果时,采用DFS一次遍历获得对所有点或者边更改的结果。
  值的注意的是,对于点差分和边差分会有一些细微的区别。
  点差分:
  设将两点u,v之间路径上的所有点权增加x,o=LCA(u,v),o的父亲节点为p,则操作如下:
  我们需要将u,v的值加x,将o的权值减x,将p的权值减x
  操作前:
在这里插入图片描述
  操作后:
在这里插入图片描述
  边差分:
  边差分与点差分有一些细微的不同,设将两点u,v之间路径上的所有变权增加x,o=LCA(u,v),o的父亲节点为p,则操作如下:
  我们需要将u,v的值加x,将o的权值减2*x
  还是以上图为例,这里求边的差分后的结果如图所示:
在这里插入图片描述

例题

边差分模板题

//树上差分的模板题目
#include<bits/stdc++.h>
using namespace std;
//这里以tarjan算法辅助求解

const int N=100010;
//并查集
int arr[N];
int find(int x){
   
    return x==arr[x]?x:arr[x]=find(arr[x]);
}
void merge(int x,int y){
   
    x=find(x);
    y=find
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值