「算法笔记」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 ...
随机推荐
- ace
ace An ace is a playing card, die or domino with a single pip. In the standard French deck, an ace h ...
- acquaint
Interpersonal relationships are dynamic systems that change continuously during their existence. Lik ...
- 基于MQTT协议实现远程控制的"智能"车
智能,但不完全智能 虽然我不觉得这玩意儿有啥智能的,但都这么叫就跟着叫喽. 时隔好几天才写的 其实在写这篇博文的时候我已经在做升级了,并且已经到了中后期阶段了. 主要是业余时间做着玩,看时间了. 规格 ...
- LeetCode398-随机数索引
原题链接:[398. 随机数索引]:https://leetcode-cn.com/problems/random-pick-index/ 题目描述: 给定一个可能含有重复元素的整数数组,要求随机输出 ...
- 【Android】No Android SDK found(mac)+ 真机调试
[1]No Android SDK found 如果没下载SDK,可以去google官方下载 如果因为上网问题,这里提供两个网址,有人整理好了,这里先谢谢他们,下面两个择其一下载 http://to ...
- HDFS初探之旅(二)
6.HDFS API详解 Hadoop中关于文件操作类疾病上全部在"org.apache.hadoop.fs"包中,这些API能够支持的操作包含:打开文件.读写文件.删除文件等. ...
- 3.5 Rust Generic Types, Traits, and Lifetimes
Every programming language has tools for effectively handling the duplication of concepts. In Rust, ...
- 解决ViewPager与ScrollView 冲突
ViewPager来实现左右滑动切换tab,如果tab的某一项中嵌入了水平可滑动的View就会让你有些不爽,比如想滑动tab项中的可水平滑动的控件,却导致tab切换. 因为Android事件机制是从父 ...
- SpringMVC(3):AJAX
一,AJAX 简介 AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML) AJAX 不是新的编程语言,而是一种使用现有标准的新方法 ...
- 【Services】【Web】【tomcat】配置tomcat支持https传输
1. 基础: 1.1. 描述:内网的tomcat接到外网nginx转发过来的请求之后需要和外网的客户端进行通讯,为了保证通讯内容的安装,使用tomcat使用https协议. 1.2. 链接:http: ...