给定一棵树,点有点权,边有边权,你每次修改一个点点权或者是修改一个边边权
你一开始在1号点,你每次改节点之后你需要移动到另一个节点,满足这个节点权值减去路径长度最大(下一次从这个节点移动)如果存在相同的收益,选编号最小的节点
你需要输出每次移动到的节点坐标
题解:
处理树上多条路径可以用动态淀粉质
考虑动态淀粉质,对于点分树上每个点开个线段树,下标为点分树子树中的节点,权值为这个点到子节点的收益,同时维护最大值的坐标
对于点权的修改,可以直接在点分树上暴力跳父亲
对于一条边的修改,考虑从这条边连接两个点中点分树上深度较浅的节点向上暴力跳父亲
假设当前我们跳的是 i,我们需要找x和y中哪个点在以 i 为根原树中深度最大,找那个深度大的点,发现这条边的更改影响的点恰好是这个深度较大的点的子树 所以对于每个点分树子树,我们维护一个dfs序,开线段树时按照dfs序存储(注意判断下标还要按照原编号判断),那么这个操作就是一个区间修改
查询时候还是暴力跳父亲,直接查询每个父亲中子树中除了这个点的最大值,就是一个区间查询
注意要减去父亲到这个点的距离,这个可以单点查询查出来
#include #include