Description
题目链接:SPOJ 375
给定一棵 $n$ 个节点的树,边按照输入顺序编号为 $1\sim n-1$,每条边都有一个权值 $c_i$ 需要对这棵树进行若干次操作,操作分为 $2$ 种:
CHANGE i t
:将第 $i$ 条边的权值 $c_i$ 修改为 $t$QUERY a b
:询问从节点 $a$ 到 $b$ 的路径上的边权最大值。
询问以 DONE
结束,有 $T$ 组数据。
数据范围:$T\le 20$,$n\le10^4$,$c_i,t\le 10^6$
Solution
对于这类树的题目,我们首先可以想到用树链剖分维护。而这题需要维护的边的信息,那么我们可以把每条边的信息放在较深的节点上,就转化成了维护点的信息了。
但是这样做需要注意一个问题:每次查询时,$\text{LCA}$ 的节点维护的信息是它上方的边,因此这个点不能被查询到。如何解决?我们根据树剖的性质可以发现以下方法:记 $x$ 的 $\text{DFS}$ 序为 $d_x$,那么最后查询 $u,v$ 的信息时(这里令 $u$ 的深度比 $v$ 浅),我们可以发现 $u$ 一定是 $\text{LCA}$,所以只要查询 $d_u+1,d_v$ 就可以避开 $\text{LCA}$ 了。
时间复杂度:$O(n\log^2 n)$(这里认为操作次数和 $n$ 同阶)
Code
1 |
|