1 条题解
-
0
自动搬运
来自洛谷,原作者为

Larunatrecy
举杯邀明月,对影成三人。搬运于
2025-08-24 23:01:16,当前版本为作者最后更新于2024-07-21 21:05:19,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
考场做法,写加调两个小时,应该算比较简单的做法。
我们先令 表示可以冲刺到的点的深度范围,。
我们发现因为 ,所以每次向上冲刺之后新的限制一定是当前点的 ,那么就设 表示当前在节点 ,走到 的方案数,那么一定是先向下滑到子树内某个节点 ,然后再跳到 的某个祖先 ,那么 应当满足:
- 设 为 路径上 的最小值,那么 。
枚举 ,枚举 ,用一个数组 维护当前祖先链上 值的前缀和,即可做到 。
然后考虑一下 的部分分,对于一个 ,满足 的 是祖先链上一段后缀,可以倍增出来,然后在求出来 的点的 值后,对这段后缀做一个链加,可以求
dfs序后树状数组维护,复杂度 。然后拓展到 ,依旧考虑对于一个 ,当 再往上走的时候, 会改变的点实际就是所有后缀最小值的位置。
我们可以把贡献拆成 ,然后在求出来 的时候考虑所有 或者 的 。
的处理就是 的部分,对于另一部分我们考虑对于一个 ,一定是先取一段 ,然后取到某个 的 ,我们令 为这些点里深度最大的(也就是严格的后缀最小值),那么我们枚举 ,发现此时 独立,可以倍增求出 表示上述的 的个数,可以贡献到的 也是一段祖先,依旧是一个链加。
的求法:
对于每个 ,求出 表示 到根路径上第一个 的 ,然后 构成了一棵树,那么可以贡献到的 构成了这棵新树上的一段祖先链,差分即可。
综上,我们只需用倍增和树状数组就在 复杂度解决了这个题。
- 1
信息
- ID
- 10559
- 时间
- 2000ms
- 内存
- 2048MiB
- 难度
- 7
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者