dfs序 括号序 欧拉序 树上莫队 虚树建立 傻傻分不清
括号序
进加一次,出加一次,显然最后得到的序列只有 个点。
显然我们希求将树上路径表示为区间,然后用莫队抑或是其它数据结构维护。
对于 的情况就是上图,我们发现只要取 即可达到只有路径上的点被加了一次,其他要么没加要么加 次。因此,我们只保留加 次的点。也就是说每次更新一个点就取反它的是否加入状态。
否则,显然我们取 ,再补上 的贡献即可。
欧拉序
用来求 LCA 以及求的方式能够证明某些结论。
我们可以猜想 的 LCA 就是 深度最浅的点。
下文假定 /
不难发现命题等价于记 , 的祖先不在区间内, 的兄弟不在区间内, 出现在区间内。
考虑 ,且要再次出现 要等到 回溯完后才出现。所以一定不会出现。
考虑在 之前遍历的兄弟无影响(因为要之前的遍历完才可能遍历到 ),之后的不会在区间取到,因为要 回溯上去再遍历兄弟,所以兄弟不在区间内。
若 ,显然正确。因为显然 都在 子树内。最浅的一定是 。
若不是,则 分居 的不同子树,那么要实现不同子树的遍历一定需要回溯到 再遍历下去,所以一定存在 。
综上,这样是对滴。
多点 LCA 结论!
考虑点按 序升序排列,又因为 具有可并性,相邻的并一下就好了。
考虑 表求 的过程,发现若干个小区间并起来显然是大区间的。所以求 序最小的和最大的的 即可。
虚树
显然,虚树的形态与根的选取有关/fn,见 https://ac.nowcoder.com/acm/contest/40647/C
https://www.luogu.com.cn/blog/Rainbowsjy/fou-xu-yao-nao-zi-di-jian-xu-shu
里面有一个结论。
为啥要按 dfs 序排列然后取相邻的 LCA?这一步是不是等价于求两两之间的 LCA?
考虑若 则上文的欧拉序也有 。
考虑若 ,那么 ,显然 LCA 要么出现在 要么出现在 ,所以相邻的取一下一定可以取到。
类比到多个点的情况,不难发现则将大区间划分成若干个相邻点的小区间。
那么解决完两两 LCA 之后,是不是要根据祖先后代关系建边。
tips:俺经常在想会不会求完 LCA 之后导致 LCA 的 LCA 没有在关键点中。但实际上两两求是不会的。考虑反证,若存在 满足 是 的 LCA, 同理,那么按理说不存在 ,满足 ,且存在两个原先的关键点的 LCA 为 ,但显然考虑 LNOI LCA 那道题, 的 LCA 一定是 的 LCA。。。所以这样两两 LCA 是正确的!
也就是说只有 1 个求出来后的 LCA,满足深度最小,且囊括了所有关键点。
但是太麻烦了!!!!!!
考虑我们求出所有关键点后,如何构造一棵树。
是不是 dfs?然后父子连边。
但显然我们不可能 dfs,但不难发现虚树上的 dfs 序的相对大小关系跟原树的 dfs 序的相对大小关系是等价的。
于是,我们只要按 dfs 序升序排,无非就剩 2 种情况。
-
在原树上是自上而下的关系,直接连边。
-
将 分在 2 棵子树。因为它们 dfs 序相邻,所以一定是 是虚树的叶子,y 要直接连 。
综上,我们只需要连 的边,且根据我们的 tips,不难发现对于连边到的点显然都是处理后的关键点(1 情况显然,2 情况根据 tips,发现 无论原先关键点,还是新增的,其 一定也是关键点)。
__EOF__

本文链接:https://www.cnblogs.com/xugangfan/p/16583732.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
2021-08-13 CF1327F AND Segments