loading...

[CF1806E]Tree Master

尝试 10min 思考无果。

链接

Description

给定一棵 \(n\) 个节点的树,第 \(i\) 个节点的父亲是 \(p_i\),点权为 \(a_i\)。根节点为 \(1\),定义 \(p_1=0\)。定义:

\[f(x,y)=\begin{cases} f(p_x,p_y)+a_xa_y &x\neq0\land y\neq 0\\ 0 &\text{Otherwise} \end{cases} \]

给出 \(q\) 组询问,每组询问给出 \(s,t\),求 \(f(s,t)\)\(s,t\) 到根节点的距离相等

Solution

直接进行记忆化搜索。约定:第 \(d\) 层是到根距离为 \(d\) 的节点集合。每一次递归都会减少一层。分析时间复杂度:

  • 对于节点数 \(< \sqrt{n}\) 的层:对于每个节点数为 \(x\) 的层,树中不会有超过 \(\dfrac{n}{x}\) 个这样的层,这一层经过记忆化共有 \(x^2\) 个节点,所以节点数为 \(x\) 的层总复杂度为 \(\mathcal O(nx)\)\(x\le\sqrt{n}\),所以复杂度对于所有层来说就只有 \(\mathcal O(n\sqrt{n})\)

  • 对于节点数 \(\ge \sqrt{n}\) 的层:这样的层不超过 \(\sqrt{n}\) 个,共 \(q\) 次询问,时间复杂度为 \(\mathcal O(q \sqrt n)\),对于这样的层,我们无需记忆化,也可以保证复杂度。

对于节点数 \(\le \sqrt{n}\) 的层适合使用记忆化,建议直接用数组存储,空间复杂度为 \(\mathcal O(n\sqrt{n})\)。时间复杂度为 \(\mathcal O((n+q)\sqrt{n})\)

算不算根号分治?

see submission here

posted @ 2025-02-15 22:56  goldspade  阅读(14)  评论(0)    收藏  举报