P3391 【模板】文艺平衡树 (无旋treap)

这篇博客介绍了如何使用无旋treap解决文艺平衡树的问题,通过在区间打标记并在涉及节点时下放更新来实现。文章详细阐述了解题思路,并提供了建树过程,指出建树时可模仿笛卡尔树,出栈时进行push_up操作。同时,提供了Splay版本的解题链接作为参考。
摘要由CSDN通过智能技术生成

题目传送门


解题思路

用可以提取区间的平衡树,对区间整体打标记,先不下放,等到操作涉及这个节点时再下放:交换左右儿子并给左右儿子打标记

我用的是无旋treap

刚开始需要建树,建树模仿笛卡尔树,由于所有元素出栈之后自身的儿子不会再有变化,因此出栈的时候再push_up即可,由于栈维护右链,栈顶就是root

要看Splay版本的也可以去这里看>>>Splay版本文艺平衡树(在博客比较靠下的位置)


代码

/*
1.因为维护正确顺序,因此中序遍历需要得到原数组,所以插入的时候下标越小数越小
2.之后就是选取区间操作,已经在树中就没有大小之分,只有顺序,此时只能按照个数分裂
3.pushup操作在build函数中:出栈元素,构建完之后的栈内元素
4.下放标记有点拎不清,标记了就可以,等到需要下放再交换,注意本质的东西,当前信息对的情况下能懒则懒,不需要交换子节点就等到需要下放的时候再交换
*/
#include<bits/stdc++.h>

using namespace std;

#define ll long long
#define for1(i,a,b) for (int i=a;i<=b;i++)
#define for0(i,a,b) for (int 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值