右转→https://www.cnblogs.com/mytqwqq/p/15057231.html

下面放个板子 (禁止莱莱白嫖板子)

P3369 【模板】普通平衡树

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,op,x;
struct Treap{
int rt,tot,lc[N],rc[N],val[N],sz[N],rnd[N];
void upd(int x){
sz[x]=sz[lc[x]]+sz[rc[x]]+1;
}
int getnew(int k){
val[++tot]=k,rnd[tot]=rand(),sz[tot]=1;
return tot;
}
void split(int p,int &x,int &y,int k){
if(!p){x=y=0;return ;}
if(val[p]<=k) x=p,split(rc[p],rc[p],y,k);
else y=p,split(lc[p],x,lc[p],k);
upd(p);
}
int merge(int x,int y){ //前提:x 的权值全部 < y 的权值
if(!x||!y) return x+y;
if(rnd[x]<rnd[y]){rc[x]=merge(rc[x],y),upd(x);return x;}
else lc[y]=merge(x,lc[y]),upd(y);
return y;
}
void insert(int k){
int x=0,y=0;
split(rt,x,y,k),rt=merge(merge(x,getnew(k)),y);
}
void erase(int k){
int x=0,y=0,z=0;
split(rt,x,z,k),split(x,x,y,k-1);
rt=merge(merge(x,merge(lc[y],rc[y])),z);
}
int rank(int k){
int x=0,y=0,ans;
split(rt,x,y,k-1),ans=sz[x]+1,rt=merge(x,y);
return ans;
}
int kth(int rt,int k){
if(!rt) return 0;
if(sz[lc[rt]]+1==k) return rt;
if(sz[lc[rt]]+1>k) return kth(lc[rt],k);
return kth(rc[rt],k-sz[lc[rt]]-1);
}
int pre(int k){
int x=0,y=0,ans;
split(rt,x,y,k-1),ans=kth(x,sz[x]),rt=merge(x,y);
return ans;
}
int nxt(int k){
int x=0,y=0,ans;
split(rt,x,y,k),ans=kth(y,1),rt=merge(x,y);
return ans;
}
}T;
signed main(){
srand(time(0));
scanf("%d",&n);
while(n--){
scanf("%d%d",&op,&x);
if(op==1) T.insert(x);
else if(op==2) T.erase(x);
else if(op==3) printf("%d\n",T.rank(x));
else if(op==4) printf("%d\n",T.val[T.kth(T.rt,x)]);
else if(op==5) printf("%d\n",T.val[T.pre(x)]);
else printf("%d\n",T.val[T.nxt(x)]);
}
return 0;
}

P3391 【模板】文艺平衡树

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,m,l,r;
struct Treap{
int rt,tot,lc[N],rc[N],val[N],sz[N],rnd[N],rev[N];
void pushup(int x){
sz[x]=sz[lc[x]]+sz[rc[x]]+1;
}
void pushdown(int x){
if(!rev[x]) return ;
swap(lc[x],rc[x]),rev[lc[x]]^=1,rev[rc[x]]^=1;
rev[x]=0;
}
int getnew(int k){
val[++tot]=k,rnd[tot]=rand(),sz[tot]=1;
return tot;
}
void split(int p,int &x,int &y,int k){ //按子树大小分裂
if(!p){x=y=0;return ;}
pushdown(p);
if(sz[lc[p]]+1<=k) x=p,split(rc[p],rc[p],y,k-sz[lc[p]]-1);
else y=p,split(lc[p],x,lc[p],k);
pushup(p);
}
int merge(int x,int y){
if(!x||!y) return x+y;
if(rnd[x]<rnd[y]){
pushdown(x),rc[x]=merge(rc[x],y),pushup(x);
return x;
}
else pushdown(y),lc[y]=merge(x,lc[y]),pushup(y);
return y;
}
}T;
void print(int x){
T.pushdown(x);
if(T.lc[x]) print(T.lc[x]);
printf("%d ",T.val[x]);
if(T.rc[x]) print(T.rc[x]);
}
signed main(){
srand(time(0));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
T.rt=T.merge(T.rt,T.getnew(i));
while(m--){
scanf("%d%d",&l,&r);
int x=0,y=0,z=0;
T.split(T.rt,x,y,l-1),T.split(y,y,z,r-l+1);
T.rev[y]^=1,T.rt=T.merge(x,T.merge(y,z));
}
print(T.rt);
return 0;
}

「算法笔记」FHQ-Treap的更多相关文章

  1. 「学习笔记」 FHQ Treap

    FHQ Treap FHQ Treap (%%%发明者范浩强年年NOI金牌)是一种神奇的数据结构,也叫非旋Treap,它不像Treap zig zag搞不清楚(所以叫非旋嘛),也不像Splay完全看不 ...

  2. 「算法笔记」旋转 Treap

    一.引入 随机数据中,BST 一次操作的期望复杂度为 \(\mathcal{O}(\log n)\). 然而,BST 很容易退化,例如在 BST 中一次插入一个有序序列,将会得到一条链,平均每次操作的 ...

  3. 「算法笔记」快速数论变换(NTT)

    一.简介 前置知识:多项式乘法与 FFT. FFT 涉及大量 double 类型数据操作和 \(\sin,\cos\) 运算,会产生误差.快速数论变换(Number Theoretic Transfo ...

  4. 「算法笔记」树形 DP

    一.树形 DP 基础 又是一篇鸽了好久的文章--以下面这道题为例,介绍一下树形 DP 的一般过程. POJ 2342 Anniversary party 题目大意:有一家公司要举行一个聚会,一共有 \ ...

  5. 「算法笔记」2-SAT 问题

    一.定义 k-SAT(Satisfiability)问题的形式如下: 有 \(n\) 个 01 变量 \(x_1,x_2,\cdots,x_n\),另有 \(m\) 个变量取值需要满足的限制. 每个限 ...

  6. 「算法笔记」Polya 定理

    一.前置概念 接下来的这些定义摘自 置换群 - OI Wiki. 1. 群 若集合 \(s\neq \varnothing\) 和 \(S\) 上的运算 \(\cdot\) 构成的代数结构 \((S, ...

  7. 「算法笔记」Splay

    一.简介 Splay(伸展树)是平衡树中的一种.它通过不断将某个节点旋转到根节点的位置,使整棵树仍满足 BST 的性质,并且保持平衡而不至于退化为链. 频繁访问的节点会被移动到离根节点较近的位置,进而 ...

  8. 「算法笔记」状压 DP

    一.关于状压 dp 为了规避不确定性,我们将需要枚举的东西放入状态.当不确定性太多的时候,我们就需要将它们压进较少的维数内. 常见的状态: 天生二进制(开关.选与不选.是否出现--) 爆搜出状态,给它 ...

  9. 「算法笔记」Min_25 筛

    戳 这里(加了密码).虽然写的可能还算清楚,但还是不公开了吧 QwQ. 真的想看的 私信可能会考虑给密码 qwq.就放个板子: //LOJ 6053 简单的函数 f(p^c)=p xor c #inc ...

随机推荐

  1. Shell 打印文件的最后5行

    目录 Shell 打印文件的最后5行 题解-awk 题解-tail Shell 打印文件的最后5行 经常查看日志的时候,会从文件的末尾往前查看,于是请你写一个 bash脚本以输出一个文本文件 nowc ...

  2. day07 ORM中常用字段和参数

    day07 ORM中常用字段和参数 今日内容 常用字段 关联字段 测试环境准备 查询关键字 查看ORM内部SQL语句 神奇的双下划线查询 多表查询前提准备 常用字段 字段类型 AutoField in ...

  3. Mybatis相关知识点(二)

    Mybatis解决jdbc编程的问题 1. 数据库连接创建.释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池可解决此问题. 解决:在SqlMapConfig.xml中配置数据连接池,使用 ...

  4. CentOS7 安装配置RocketMQ --主从模式(master-slave)异步复制

    机器信息 192.168.119.129 主 192.168.119.128 从 配置host[两台机器] vim /etc/hosts 添加 192.168.119.129 rocketmq-nam ...

  5. C语言产生随机数(伪)

    C语言的获取随机数的函数为rand(), 可以获得一个非负整数的随机数.要调用rand需要引用头文件stdlib.h.要让随机数限定在一个范围,可以采用模除加加法的方式.要产生随机数r, 其范围为 m ...

  6. Oracle——概要文件profile

    profile文件详解 一.目的         Oracle系统中的profile可以用来对用户所能使用的数据库资源进行限制,使用Create Profile命令创建一个Profile,用它来实现对 ...

  7. centOS7.4 , gcc4.8.5装cgdb

    从github上clone最新releast后进入文件夹 ./configure –prefix=/usr/local CXXFLAGS=-std=c++11 make&make instal ...

  8. Redis数据类型内部编码规则及优化方式

    Redis的每个键值都是使用一个redisObject结构体保存的,redisObject的定义如下: typedef struct redisObject { unsigned type:4; un ...

  9. 【编程思想】【设计模式】【创建模式creational】Pool

    Python版 https://github.com/faif/python-patterns/blob/master/creational/pool.py #!/usr/bin/env python ...

  10. 【C/C++】链表

    #include <bits/stdc++.h> using namespace std; struct node { int data; // 数据 node* next; // 指针 ...