文艺平衡树(Fhq Treap)

传送门:文艺平衡树
首先要阐述一点,Fhq Treap的按大小分裂是支持区间操作的,而按值分裂是不支持区间操作的。
Fhq Treap的分裂方式:

  • 按权值分裂
  • 按大小分裂

按权值分裂:

根据插入点的权值,将树按w为边界,分裂为两颗树,一颗树的权值大于w,一棵树的权值小于等于w,这样再把新节点合并进去,就可以维护树的平衡

按大小分裂:

根据插入点的节点大小,将树按big为边界,分裂为两颗树,一颗树的节点大小大于big,一棵树的节点大小小于等于big,这样再把新节点合并进去,不仅可以维护树的平衡,还支持区间操作

为什么按大小分裂会支持区间操作:

首先,新开的每一个节点,都可以用节点数量,代表区间中的一个端点,呢么我们如果修改区间,呢么我们只需要修改平衡树中节点数量在我们要修改的区间内即可,然后合并成新的平衡树即可,一颗平衡树的节点对应数量是一样的,我们只需要改变节点对应的值即可

该题思路:

利用支持区间修改的Fhq Treap,我们利用懒惰标记,对区间进行修改,交换当前区间的左右子树,从而达到颠倒一个区间

:随机库函数,好多版本的C++不支持,所以就自己写一个叭

参考代码:

#include <cstdio>
#include <algorithm>
#include <vector>
#include <iostream>
#include <map>
#include <queue>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cmath>
#include <set>
using namespace std;
const int inf = (1 << 30);
typedef long long ll;
const int base = 131;
const int maxn = 1e5 + 5;
//vector<ll> vec;
//ll n, sum[maxn * 10], c[maxn * 10], a[maxn];
//vector<int> vec;
int su = 1;
int rand()
{
   
   
    su = (su * base) % 1000007;
    return su;
}
int cnt, rt;
struct node
{
   
   
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值