右转→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. Celery进阶

    Celery进阶 在你的应用中使用Celery 我们的项目 proj/__init__.py   /celery.py   /tasks.py 1 # celery.py 2 from celery ...

  2. hadoop/spark面试题

    总结于网络 转自:https://www.cnblogs.com/jchubby/p/5449379.html 1.简答说一下hadoop的map-reduce编程模型 首先map task会从本地文 ...

  3. Java中方法的定义与使用

    Java中方法的定义与使用 1.方法的定义: 方法是一段可以被重复调用的代码块. 方法的声明: public static 方法返回值 方法名([参数类型 变量--]){ 方法代码体: return ...

  4. shell脚本计算Linux网卡流量

    本文介绍了计算linux网卡流量的一个shell脚本,一个通过固定间隔时间获取ifconfig eth0 的字节值而计算出网卡流量的方法,有需要的朋友参考下. 使用shell脚本计算Linux网卡流量 ...

  5. C++易错小结

    C++ 11 vector 遍历方法小结 方法零,对C念念不舍的童鞋们习惯的写法: void ShowVec(const vector<int>& valList) { int c ...

  6. IDEA 使用rest client测试

    一.进入 rest 控制台 idea 导航栏 ==> Tools ==> HTTP Client ==> Test RESTFUL Web Service 如图: 一般来说,idea ...

  7. [笔记] encoder-decoder NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE

    原文地址 :[1409.0473] Neural Machine Translation by Jointly Learning to Align and Translate (arxiv.org) ...

  8. java多线程4:volatile关键字

    上文说到了 synchronized,那么就不得不说下 volatile关键字了,它们两者经常协同处理多线程的安全问题. volatile保证可见性 那么volatile的作用是什么呢? 在jvm运行 ...

  9. Redis慢查询配置和优化

    目录 一.介绍 二.参数配置 sql动态配置 配置文件设置 三.sql操作 四.优化 一.介绍 慢查询只记录redis执行时间,并不记录redis服务到客户端之间的网络问题. 超过多少毫秒的才被记录 ...

  10. [源码解析] PyTorch 分布式之弹性训练(1) --- 总体思路

    [源码解析] PyTorch 分布式之弹性训练(1) --- 总体思路 目录 [源码解析] PyTorch 分布式之弹性训练(1) --- 总体思路 0x00 摘要 0x01 痛点 0x02 难点 0 ...