LA 问题的若干种解法
看了眼 P5903 的题解区,方法还是挺多的,那我就浅浅的总结一下。
Algorithm 1
最简单的,直接往他的父亲节点跳,单次询问复杂度
Algorithm 2
我们用倍增的思想来做,这个也很简单不多讲,单次的复杂度为
Algorithm 3
我们可以考虑使用重链剖分。如果这个链的顶端没有跳过的话,就直接跳到链顶的父亲,否则直接推就可以了,因为
看似复杂度是一样的,但是速度比 Algorithm 2 要快许多,此时已经可以通过了。
Algorithm 4
我们考虑如何优化 Algorithm 3。
我们发现我们需要跳到
我们发现一个点上面至多有
Algorithm 5
我们依然考虑如何优化 Algorithm 3。
我们可以一次跳
单次复杂度为
Algorithm 6
这题的正解:长链剖分。
比较麻烦。先按照节点深度树剖。然后利用倍增数组跳到
若之后剩下的级数为正,则利用向上的数组求出答案,否则利用向下的数组求出答案。单次时间复杂度
注意:以下内容非本题正解!!
Algorithm 7
这题还有一个比较科技的做法-----用
我们发现
然后欧拉序具有
定义:
定义:
引理:对于任意的
假设我们现在给出的数组为
然后当我们查询
-
若
,答案为 。 -
否则
- 令
,若 ,那么答案为 。 - 否则,我们令
,那么答案为 。
- 令
那么问题就变成了如何在
Algorithm 8
最高贵的线性做法!!!!!是 Algorithm 7 的进阶版本,在 Algorithm 7 当中定义的所有东西都在这里适用。
我们先定义
考虑分块,我们取
对于每一个块,我们维护一下两个信息:
-
,其中 。 -
,其中 。
注意到如果
然后我们考虑如何查询
- 若
返回 。 - 若
:- 通过块内查询,若答案在块内,则直接返回;
- 若答案不在块内,那么返回
;
:- 若
,返回 ; - 令
:- 若
,那么返回 ; - 否则返回
。
- 若
- 若
然后我们发现因为:
所以所有的情况,都会变成
然后我们考虑块内怎么做。
接下来是利用位掩码的方法,一般块长取
那么,
我们将
那么我们就获得了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话