树上笛卡尔树(点权Kruskal重构树)

题意

给一 k e ke ke 树,求所有路径 ( x , y ) (x,y) (x,y),满足 x → y x \to y xy 中,编号最小为 x x x,最大为 y y y 的数量。 n ≤ 2 × 1 0 6 n \leq 2 \times 10^6 n2×106

题解

考虑到最大最小值问题,我们想到用笛卡尔树,而树上的笛卡尔树形态则类似 K r u s k a l Kruskal Kruskal 重构树( x , y x,y x,y 在重构树上的 L c a Lca Lca 为原树上的路径 x → y x \to y xy 上的最值)。
至于构建:
对于一 k e ke ke 从大到小( x , y x,y x,y L c a Lca Lca 为原树路径上的最大值)的树,我们按照编号从小到大,假设当前的点为 p p p,设 p p p 连向的点中,编号小于 p p p,( v < p , v ∈ p v<p,v \in p v<p,vp)的点的祖先的祖先为 p p p,( x = g e t ( v ) , f a [ x ] = p x=get(v),fa[x]=p x=get(v),fa[x]=p)。

于是我们构建两 k e ke ke 树,一 k e ke ke 从大到小,一 k e ke ke 从小到大。

我们发现: x → y x \to y xy 合法,当且仅当 x x x 在一 k e ke ke 树上是 y y y 的祖先, y y y 在另一 k e ke ke 树上是 x x x 的祖先。

所以剩下的用 d f s dfs dfs 序,二维偏序这些随便算算即可。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值