树上信息维护

本文详细介绍了在树上进行不同操作时如何使用不同的数据结构来维护信息,包括子树加、子树求和、链加、单点求值、链加子树求和、点加链求和等。通过 dfs 序、线段树、树状数组等数据结构,解释了如何高效地处理这些操作,并提供了相关操作的样例输入和输出。
摘要由CSDN通过智能技术生成

对于树上的信息,根据操作的不同,用不同的数据结构来维护,它们是相互独立的。如果有多种操作,分开维护最后加起来就行了。

目录

一、子树加,子树求和

二、链加,单点求值

三、链加,子树求和

四、点加,链求和

五、子树加,链求和


一、子树加,子树求和

【口胡】

可以利用dfs序。如果记录L[i]表示i号点的dfs序,R[i]表示i号点的子树搜索完后的dfs序那么x是y的祖先等价于:

L[y]∈ [L[x],R[x]] 

dfs时用L数组记录dfn[x],当子树搜索完后,用R数组记录R[x].如下:

void dfs(int x,int fa){
	L[x]=++sz;
	for(int i=Head[x];i;i=Next[i])
        if(V[i]!=fa)
		    dfs(V[i],x);
	R[x]=sz;
}

这时要求子树和或子树加,用线段树维护就行了。

线段树模板

二、链加,单点求值

先上个模板题

描述

有n个节点N-1条边,这是一颗树,有2个操作:

1 x y v:表示将节点x到y最短路径上所有的点的权值+v

【链加】

 

2 x:表示查询节点x的权值

【单点求值】

 

开始的时候每个节点的权值是0

输入

第一行是数N,表示N个节点 接下来n-1行,每行描述了n-1条边。

接下来是一个数q表示有q次查询与询问 接下来q行,格式如题

输出

若干行

样例输入[复制]

3
1 2
2 3
3
1 1 2 5
1 1 3 2
2 2

样例输出[复制]

7

提示

n<=1e5 q<=1e5

【口胡】

对于一个链加,我们把它看做一个点到根的路径加:

这是一条从u到v的路径,g是u和v的最近公共祖先,在这条链上加C可以看做u到root加C,然后v到root加C,然后g到root减去2*C。但是这样g点的修改就被抵消,所以用一个额外的数组app记录当一个点为lca时修改的值。

我们修改时可以把修改放在u,v和g上(单点修改),查询时,我们就在这个点的子树中询问贡献(区间求和)。【因为一个点子树中的修改才对它有影响,其他地方的修改对它是没有贡献的】

这里用树状数组维护,支持单点修改和区间求和。【树状数组建立在DFS序上。】

假设我们查询一个点x,它的子树中有若干个修改,链1,链2,链3,链4.

对于链1,链2,链3,它们穿过了x,查询x的子树时就会把点1,点2,点3的贡献计入x中。

对于链4,虽然它在x的子树中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值