题面:
题意:
给定一棵有根树,根节点为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) t∈path(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]</