左偏树

具体见OI-wiki,但是OI-wiki对左偏树的“外节点”的定义好像错了,其实应该就是指空节点;删除任意一个数的那个部分就不用看了,没啥用

f(k)表示distk的左偏树最少包含的点,则有f(k)2k1

证明:f(k)单调递增,这是因为此时右子树的dist肯定为k1,也就包含f(k1)个点,算上根节点和左子树,于是有f(k)单增

显然f(1)211=1

假设当n=k1时,f(n)2n1;当n=k时,f(n)2k11+2k11+1=2k1(右子树为f(k1)个节点,左子树至少为f(k1)个节点,算上根节点),证毕

也就是说至少有dist-1层是满二叉树,于是时间复杂度得以保证

那么对于这道题目,我们还需要用并查集去维护左偏树。具体来说,每个左偏树都对应一个并查集,而且左偏树的根节点就是并查集的代表元素。于是前面三个操作都很容易解决了,但是第四个操作看起来要对并查集进行分离。实际上不用,这里解锁一个新操作,即并查集的换根操作。删除左偏树的根节点后,我们在并查集中不删除代表元素;合并左儿子和右儿子之后,新的左偏树的根作为并查集的代表元素,此时只需要将原来的根节点的父亲指向新的根节点,新的根节点的父亲指向自己就好了。易知这样做不会影响答案

具体见打卡代码

posted @   最爱丁珰  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2023-08-18 阶乘分解
点击右上角即可分享
微信分享提示