学了这么久的线段树,竟然从没写过树上线段树。其实本质还是线段树。只是把一开始的树结构用 dfs 序变成线段的形式,然后再用线段树加速。
问题是给你一颗树,每个节点都有权重,问从起点 0 开始必须经过节点 x 的权重和的最大值。经过 dfs,$L[x], R[x]$ 是以 $x$ 为根的节点。那么每次更新 $x$ 的值相当于给区间 $L[x], R[x]$ 加一个值。而最终我们的问题,其实就是求区间 $L[x], R[x]$ 的最大值。最后写线段树时要延迟更新。
例题 hdu
1 | template<typename T> |