AtCoder Beginner Contest 298


\[\large \text{Round 5 : AtCoder Beginner Contest 298 (VP)} \]

一言:
成一事者,是失之不渝的愚者;毁一事者,是停滞不前的贤者。
——不正经的魔法讲师

\(\text{Ex: Sum of Min of Length}\)

这次比赛总体难度不是很大,可能也是我第一次自己独立做出 \(\text{Ex}\)。(虽然不是场切,也调了很久,没看题解,所以纪念一下。)

这题维护的东西比较多,下面我们一个一个列出来。(默认以 \(1\) 为根。)

  • \(dep_i\) 表示 \(i\) 节点的深度。

  • \(siz_i\) 表示 \(i\) 子树的大小。

  • \(dis_i\) 表示 \(i\)\(i\) 子树中每个点的距离之和。

  • \(eds_i\) 表示 \(i\) 到每个点的距离之和。

  • \(f_{i,j}\) 表示 \(i\)\(2^j\) 个祖先是谁。

显然,\(dis_i\) 正常当作树形 \(\text{DP}\) 求,\(eds_i\) 就换根求,\(f_{i,j}\) 就是一个倍增,用来求 \(\text{lca}\)

接着,对于每一组询问 \((x,y)\),设 \(z=lca(x,y)\)。假设 \(x\) 的深度比 \(y\) 的深度大,否则交换。定义 \(dist\)\(x\)\(y\)\(lca\) 的总和。

首先对于不属于 \(z\) 子树的那一些点,答案显然就是 \(z\) 到哪些点的距离之和 \(eds_z - dis_z\) 在加上 \(z\)\(y\) 的距离(肯定比到 \(x\) 的距离小) 乘上 \(n-size_z\)。(第二部分是因为那些距离还要走到 \(z\)

显然,对于 \(x\)\(\dfrac{dist}{2}\) 级祖先的子树,显然这些点的距离都是到 \(x\) 最小(设这个祖先为 \(k\))。所以这部分答案就是 \(x\) 到所有点的距离,减去 \(x\) 到这个祖先子树以外的距离,也就是 \(eds_x - (eds_z-dis_z)-(n-siz_k) \times \dfrac{dist}{2}\)

最后对于 \(y\) 的那一部分,也就是 \(y\) 到在 \(z\) 子树中不包含 \(k\) 的子树的点的距离之和。也就是将 \(y\) 到所有点的距离减去 \(y\)\(z\) 子树以外点的距离,再减去 \(k\) 子树中点到 \(y\) 的距离,就是 \(eds_y-dis_k-siz_k\times (dist-\dfrac{dist}{2}) - (eds_z-dis_z)-(n-size_z)\times (dep_y-dep_z)\)

最后将三部分加起来就是答案。

下面是一些需要特殊处理的情况,每种都需要特殊处理。(至于怎么处理,就举一反三吧。)

  • \(x=y\)

  • \(k=z\)

  • \(z=y\)

\(\text{Submission}\)

\(\text{What I learned:}\)

  • 这场比赛在思想上并没有学到什么特殊的,但是独立做出 \(\text{Ex}\) 还是让我很开心的,增强了一点自信心吧,总之还是要大胆的去实践自己推出来的东西。
posted @ 2024-03-04 15:12  Saltyfish6  阅读(3)  评论(0编辑  收藏  举报
Document