Luogu6778 [Ynoi2009] rpdq

题意:给定一棵 个点的树,边有边权。

每次询问给出 ,求:

答案对 取模。

允许离线, ,时限 ,空限


本题解无 树分块,请放心食用。(迫真)

使用二次离线莫队

容易将问题转化为

的求解。

难点在于 ,这是 “经典问题”,将点 到根的点权加上父边边权,然后查询 到根的路径和即可得到。

问题转化为 次路径加与 次路径求和。

然后我们尴尬地发现,常用的树上数据结构几乎全部带 ,不能很好地平衡复杂度。


考虑树分块

每个点只归属于一个块,每个块形成一个树上联通块。记块中的最浅点为关键点。

接下来是分块方法。

,则将 的子树分成一块。(第一类)

这样还剩了所有子树大小 的点没有归属,这些点构成一棵分叉为 的树。

对于每条不分叉的链条,尽量按照 划分,如果最后剩下一小段不足 ,也直接分成一块。(第二类)

第二类块的个数为 ,形态为一条链

第一类块的个数不限,形态为一棵子树。一类块下面不再有块,一类块上面一定是二类块。

的父亲, 所在块的关键点。

  • 进行链加

    表示 到关键点的路径的和。

    在一类块中,暴力 整块更新 ,然后修改 ,则转化为 在二类块中的情况。

    在二类块中,仍然先暴力 整块更新

    还会对祖先块的 进行贡献。注意到由于二类块形态是一条链,一定是整个块都加,只需要记下整块标记。

    对于二类块的关键点,维护到根的路径的和,由于二类块的个数较少,可以每次修改后暴力 计算。

  • 进行链查询

    在一类块中,答案加上 ,然后查询 ,则转化为 在二类块中的情况。

    在二类块中,答案为

    其中 表示块 被整体加的次数, 表示 到关键点的距离, 表示关键点 到根的路径和。

时间复杂度 ,空间复杂度