dfs序 括号序 欧拉序 树上莫队 虚树建立 傻傻分不清

括号序

进加一次,出加一次,显然最后得到的序列只有 2n 个点。

void dfs(int x) { in[x]=++tot; for(y) dfs(y); out[x]=++tot; }

image

image

显然我们希求将树上路径表示为区间,然后用莫队抑或是其它数据结构维护。

对于 yTx 的情况就是上图,我们发现只要取 [inx,iny] 即可达到只有路径上的点被加了一次,其他要么没加要么加 2 次。因此,我们只保留加 1 次的点。也就是说每次更新一个点就取反它的是否加入状态。

image

否则,显然我们取 [outx,iny],再补上 LCA 的贡献即可。

欧拉序

用来求 LCA 以及求的方式能够证明某些结论。

void dfs(int x) { id[x]=++tot; v[tot]=x; for(y) { dfs(y); v[++tot]=x; } }

我们可以猜想 x,y 的 LCA 就是 v[idx,idy] 深度最浅的点。

下文假定 idx<idy/

不难发现命题等价于记 LCA(x,y)=dd 的祖先不在区间内,d 的兄弟不在区间内,d 出现在区间内。

考虑 idfad<idx<idy ,且要再次出现 fad 要等到 d 回溯完后才出现。所以一定不会出现。

考虑在 d 之前遍历的兄弟无影响(因为要之前的遍历完才可能遍历到 d),之后的不会在区间取到,因为要 d 回溯上去再遍历兄弟,所以兄弟不在区间内。

d=x,显然正确。因为显然 [idx,idy] 都在 x 子树内。最浅的一定是 x

若不是,则 x,y 分居 d 的不同子树,那么要实现不同子树的遍历一定需要回溯到 d 再遍历下去,所以一定存在 d

综上,这样是对滴。

多点 LCA 结论!

考虑点按 dfs 序升序排列,又因为 LCA 具有可并性,相邻的并一下就好了。

考虑 ST 表求 LCA 的过程,发现若干个小区间并起来显然是大区间的。所以求 dfs 序最小的和最大的的 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?

考虑若 dfnx<dfny 则上文的欧拉序也有 idx<idy

考虑若 dfnx<dfny<dfnz,那么 LCA(x,z)=[idx,idz],显然 LCA 要么出现在 [idx,idy] 要么出现在 [idy,idz],所以相邻的取一下一定可以取到。

类比到多个点的情况,不难发现则将大区间划分成若干个相邻点的小区间。

那么解决完两两 LCA 之后,是不是要根据祖先后代关系建边。

tips:俺经常在想会不会求完 LCA 之后导致 LCA 的 LCA 没有在关键点中。但实际上两两求是不会的。考虑反证,若存在 d1,d2 满足 d1x1,y1 的 LCA,d2 同理,那么按理说不存在 D,满足 LCA(d1,d2)=D,且存在两个原先的关键点的 LCA 为 D,但显然考虑 LNOI LCA 那道题,y1,x2 的 LCA 一定是 d1,d2 的 LCA。。。所以这样两两 LCA 是正确的!

也就是说只有 1 个求出来后的 LCA,满足深度最小,且囊括了所有关键点。

一种方法是增量法:https://www.cnblogs.com/alex-wei/p/Tree_Tree_Tree_Tree_Tree_Tree_Tree_Tree_Tree_Tree_Tree_Tree_Tree_Tree_Tree.html

但是太麻烦了!!!!!!

考虑我们求出所有关键点后,如何构造一棵树。

是不是 dfs?然后父子连边。

但显然我们不可能 dfs,但不难发现虚树上的 dfs 序的相对大小关系跟原树的 dfs 序的相对大小关系是等价的。

于是,我们只要按 dfs 序升序排,无非就剩 2 种情况。

  1. x,y 在原树上是自上而下的关系,直接连边。

  2. LCA(x,y)x,y 分在 2 棵子树。因为它们 dfs 序相邻,所以一定是 x 是虚树的叶子,y 要直接连 LCAy

综上,我们只需要连 LCAy 的边,且根据我们的 tips,不难发现对于连边到的点显然都是处理后的关键点(1 情况显然,2 情况根据 tips,发现 x,y 无论原先关键点,还是新增的,其 LCA 一定也是关键点)。


__EOF__

本文作者F x o r G
本文链接https://www.cnblogs.com/xugangfan/p/16583732.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   FxorG  阅读(283)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
历史上的今天:
2021-08-13 CF1327F AND Segments
点击右上角即可分享
微信分享提示