[虚树] [LCA] [Treap] [CH Round #56] 异象石

题目传送门
这题是和某JMS一中联考的题……也不知道NOIP模拟赛为什么会有平衡树和虚树的知识估计是卡AK的,据说SDOI2015的寻宝游戏是一道题……
虚树可以处理一类树上问题,每次操作为树上的点打标记,询问打上标记的一类点的性质。这种性质与未打标记的点无关或可以消除这种影响。
很自然想到把这些点单独拎出来建一棵新树,在新树处理所有询问,可是单独拎出来点破坏了原有的父子信息,所以我们把LCA也拽出来,这样就能根据这重建出一棵虚树了……
可是这道题需要动态改变虚树,并且在虚树上询问……
既然我们要为一棵树加入一个点,求最小距离,当然是连离这个点最近的点的边。如果我们做虚树的DFS序,所求答案就是DFS序中相邻两点的距离和,加入一个点相当于在虚树DFS序的序列中插入一个点。
那怎么操作呢?比如要在 a , b a,b a,b的连续序列里插入 c c c变成 a , c , b a,c,b a,c,b,就需要加上 dis ( a , c ) + dis ( b , c ) \text{dis}(a,c)+\text{dis}(b,c) dis(a,c)+dis(b,c),减去 dis ( a , b ) \text{dis}(a,b) dis(a,b),但是这样加最终答案就需要除以2,因为同一条路径会计算两遍。
删除是同理的,减去 dis ( a , c ) + dis ( b , c ) \text{dis}(a,c)+\text{dis}(b,c) dis(a,c)+dis(b,c),加上 dis ( a , b ) \text{dis}(a,b) dis(a,b)
因为我们要快速找到这个DFS序列里 c c c要插入的位置之前和之后的点,所以用一棵平衡树维护这个虚树的DFS序。
时间复杂度 O ( n log ⁡ 2 n ) O(n\log_2 n) O(nlog2n)
原本这道题是用来卡AK的……不过我觉得dayu的题才是真正成功地卡ak题蛤蛤蛤蛤
Code

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值