AtCoder Beginner Contest 298


Round 5 : AtCoder Beginner Contest 298 (VP)

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

Ex: Sum of Min of Length

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

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

  • depi 表示 i 节点的深度。

  • sizi 表示 i 子树的大小。

  • disi 表示 ii 子树中每个点的距离之和。

  • edsi 表示 i 到每个点的距离之和。

  • fi,j 表示 i2j 个祖先是谁。

显然,disi 正常当作树形 DP 求,edsi 就换根求,fi,j 就是一个倍增,用来求 lca

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

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

显然,对于 xdist2 级祖先的子树,显然这些点的距离都是到 x 最小(设这个祖先为 k)。所以这部分答案就是 x 到所有点的距离,减去 x 到这个祖先子树以外的距离,也就是 edsx(edszdisz)(nsizk)×dist2

最后对于 y 的那一部分,也就是 y 到在 z 子树中不包含 k 的子树的点的距离之和。也就是将 y 到所有点的距离减去 yz 子树以外点的距离,再减去 k 子树中点到 y 的距离,就是 edsydisksizk×(distdist2)(edszdisz)(nsizez)×(depydepz)

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

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

  • x=y

  • k=z

  • z=y

Submission

What I learned:

  • 这场比赛在思想上并没有学到什么特殊的,但是独立做出 Ex 还是让我很开心的,增强了一点自信心吧,总之还是要大胆的去实践自己推出来的东西。
posted @   Saltyfish6  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
Document
点击右上角即可分享
微信分享提示