树分治
dinlon
这个作者很懒,什么都没留下…
展开
-
P3714 [BJOI2017]树的难题(点分治/线段树/单调队列)
P3714 [BJOI2017]树的难题 求解树上长度在L到R的树链中颜色段权值和最大的链。 首先求解树上链的问题,而且限制了链的长度,那么我们需要点分治处理,然后考虑每次分治,我们可以把链分成两类,先处理同色连通块,再处理异色连通块,然后采用每次查询一个子树的答案然后加入这个子树的方法。然后对于一个给定链,对应了一个区间的权值,所以我们直接使用线段树即可,然后合并的时候直接线段树合并即可。 但是这个问题还有一个特殊性质,就是我们每次查询的区间长度是一定的,所以如果询问有序,就可以使用单调队列处理了,那么我原创 2021-02-14 10:13:11 · 133 阅读 · 0 评论 -
P6329 【模板】点分树 | 震波
P6329 【模板】点分树 | 震波 这是一道模板题,需要支持两个操作,操作一就是单点修改点权,操作二就是查询距离x不超过k的点权值和。 我们考虑建出点分树,然后对于每个点维护两个数据结构,一个处理当前分治范围到当前点的贡献,一个处理当前分治范围到点分树上父亲节点的贡献,然后我们就可以通过容斥来得到当前范围内的贡献了。 另外我们还需要预处理lca,需要st表处理一下。 代码细节: 对于预处理lca的部分,代码实现比较巧妙,尤其是定义getmn函数节省了很多的代码 另外树状数组需要动态开,所以我们就用vec原创 2021-02-09 16:55:53 · 173 阅读 · 0 评论 -
P2664 树上游戏(点分治/计数题计算贡献/树上差分)
P2664 树上游戏 对于树上n个点,每个点有不同颜色,求解每个点到其他点的路径上不同颜色个数之和。 首先看到这种树上点对问题,我们可以想到点分治,然后考虑每次分治如何求解答案,本质上就是一个数颜色的问题,然后我们采用类似的思路,考虑每个颜色第一次出现时的贡献,但是现在的问题就在于一条链是没有前后的,所以我们可能需要一些计算。 首先对于分治中心的贡献计算,我们可以从中心开始dfs,在每个颜色第一次出现的地方有size的贡献。 然后考虑每个子树内部的点,对于在从当前点到分治中心的链上出现过的颜色,我们直接将其原创 2021-02-05 20:18:48 · 123 阅读 · 0 评论