「算法笔记」FHQ-Treap
右转→https://www.cnblogs.com/mytqwqq/p/15057231.html
下面放个板子 (禁止莱莱白嫖板子)
- #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;
- }
- #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的更多相关文章
- 「学习笔记」 FHQ Treap
FHQ Treap FHQ Treap (%%%发明者范浩强年年NOI金牌)是一种神奇的数据结构,也叫非旋Treap,它不像Treap zig zag搞不清楚(所以叫非旋嘛),也不像Splay完全看不 ...
- 「算法笔记」旋转 Treap
一.引入 随机数据中,BST 一次操作的期望复杂度为 \(\mathcal{O}(\log n)\). 然而,BST 很容易退化,例如在 BST 中一次插入一个有序序列,将会得到一条链,平均每次操作的 ...
- 「算法笔记」快速数论变换(NTT)
一.简介 前置知识:多项式乘法与 FFT. FFT 涉及大量 double 类型数据操作和 \(\sin,\cos\) 运算,会产生误差.快速数论变换(Number Theoretic Transfo ...
- 「算法笔记」树形 DP
一.树形 DP 基础 又是一篇鸽了好久的文章--以下面这道题为例,介绍一下树形 DP 的一般过程. POJ 2342 Anniversary party 题目大意:有一家公司要举行一个聚会,一共有 \ ...
- 「算法笔记」2-SAT 问题
一.定义 k-SAT(Satisfiability)问题的形式如下: 有 \(n\) 个 01 变量 \(x_1,x_2,\cdots,x_n\),另有 \(m\) 个变量取值需要满足的限制. 每个限 ...
- 「算法笔记」Polya 定理
一.前置概念 接下来的这些定义摘自 置换群 - OI Wiki. 1. 群 若集合 \(s\neq \varnothing\) 和 \(S\) 上的运算 \(\cdot\) 构成的代数结构 \((S, ...
- 「算法笔记」Splay
一.简介 Splay(伸展树)是平衡树中的一种.它通过不断将某个节点旋转到根节点的位置,使整棵树仍满足 BST 的性质,并且保持平衡而不至于退化为链. 频繁访问的节点会被移动到离根节点较近的位置,进而 ...
- 「算法笔记」状压 DP
一.关于状压 dp 为了规避不确定性,我们将需要枚举的东西放入状态.当不确定性太多的时候,我们就需要将它们压进较少的维数内. 常见的状态: 天生二进制(开关.选与不选.是否出现--) 爆搜出状态,给它 ...
- 「算法笔记」Min_25 筛
戳 这里(加了密码).虽然写的可能还算清楚,但还是不公开了吧 QwQ. 真的想看的 私信可能会考虑给密码 qwq.就放个板子: //LOJ 6053 简单的函数 f(p^c)=p xor c #inc ...
随机推荐
- java.sql.SQLException: Cannot create com._51doit.pojo.User: com._51doit.pojo.User Query: select * from user where username = ? and password = ? Parameters: [AA, 123]
在从数据库中查询数据,并存入javabean中去时,报这个错误 原因:在建立User类去存储信息时没有创建无参构造方法,创建一个无参构造方法即可
- Android 开源框架Universal-Image-Loader加载https图片
解决方案就是 需要 android https HttpsURLConnection 这个类忽略证书 1,找到 Universal-Image-Loader的library依赖包下面com.nostr ...
- @Value("#{}")与@Value("${}")
开发过程中,有些配置信息是根据环境的不同而有不同的值.这个时候,我们需要获取配置文件中的值或者spring容器中的值,可以通过@value注解获取相关的值. @Value("#{}" ...
- java.util.Collections.copy()方法注意点
今天发现单独的将一个ArrayList的对象添加到另外一个ArrayList的时候,总是源列表和目的列表相同的内存地址.原因如下: 偶然看到了Collections的copy(List desc,Li ...
- redis入门到精通系列(六):redis的事务详解
(一)事务的概念 谈到数据库的高级应用,不可避免会谈到事务.熟悉mysql的朋友们对事务肯定不陌生,简单来讲事务就是控制一个数据库操作序列要么全部执行要么全部不执行.今天我们就来了解redis中的事务 ...
- Redis集群的三种模式
一.主从模式 通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失(或少量损失)数据,因为持久化会把内存中数据保存到硬盘上,重启会从硬盘上加载数据. 但是由于数据是存储在一台服务器上的, ...
- 【编程思想】【设计模式】【行为模式Behavioral】chaining_method
Python版 https://github.com/faif/python-patterns/blob/master/behavioral/chaining_method.py #!/usr/bin ...
- 用oracle中的Row_Number实现分页
Row_Number实现分页 1:首先是 select ROW_NUMBER() over(order by id asc) as 'rowNumber', * from table1 生成带序号 ...
- 【Linux】【Services】【SaaS】Docker+kubernetes(9. 安装consul实现服务注册发现)
1. 简介 1.1. 官方网站: https://www.consul.io 1.2. Consul的功能: 服务发现:通过DNS或HTTP接口使得消费者发现服务,应用程序可以轻松找到所依赖的服务. ...
- Spring Batch Event Listeners
Learn to create and configure Spring batch's JobExecutionListener (before and after job), StepExecut ...