HDU - 5390 tree (可持久化字典树+线段树)

该博客介绍了如何使用可持久化字典树和线段树解决一道关于树上权值修改和查询最大异或值的问题。首先,博主展示了不带修改时的解决方案,利用可持久化字典树处理查询。接着,博主讨论了在考虑修改的情况下,将单点修改转化为子树修改,通过dfs序建立线段树,并在线段树节点上维护字典树,实现单次修改O(log^2 n)的时间复杂度。最后,博主分析了查询操作的时间复杂度和整体的空间复杂度,均为O(nlog^2 n)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目vj链接

题面:
在这里插入图片描述

题意:
给定一棵有根树,根节点为1,节点 i i i 的权值为 v i vi vi
有以下两种操作:
(1) 0 x y ---- 将节点 x x x 的权值改为 y y y
(2) 1 x ---- 查询 v x   x o r   v t v_x\space xor\space v_t vx xor vt 的最大值,其中 t ∈ p a t h ( x , r o o t ) t \in path(x,root) tpath(x,root)

题解:
①、考虑不带修改
v x v_x vx 是一个已知的定值,查询 v x v_x vx 与一组值 v t v_t vt 中的某个数的异或的最大值,用树上可持久化字典树即可处理。
空间复杂度 O ( n l o g n ) O(nlogn) O(nlogn),时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)

②、考虑修改。
查询具有特殊性,每次查询的 v t v_t vt 是根节点到 x x x 点这一条链上的值。

修改是单点修改。那么修改一个点之后只会影响它的子树。

所以我们把修改单点的值,变为修改子树。
我们把修改分解为一次删除和一次增加。
即对于子树中所有的节点到根节点的路径上减去 v x v_x vx 加上 y y y

我们考虑 d f s dfs dfs 序上建立线段树,我们对于线段树的每个节点(线段树的一个节点对应一个区间)建立一棵字典树。假设我们当前要修改的区间为 [ l , r ] [l,r] [l,r]</

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值