模板——Fhq_treap
$Fhq$ $treap$
- #include <bits/stdc++.h>
- using namespace std;
- const int MAXN=100100;
- int n,root,t;
- struct node
- {
- int val,key,si,son[2],g;
- }sh[MAXN];
- deque <int> q;
- int newnode(int v)
- {
- t++;
- sh[t].si=sh[t].g=1;
- sh[t].val=v;
- sh[t].key=rand();
- return t;
- }
- void pushup(int x)
- {
- sh[x].si=sh[x].g+sh[sh[x].son[0]].si+sh[sh[x].son[1]].si;
- }
- void split(int now,int k,int &x,int &y)
- {
- if (now==0)
- {
- x=y=0;
- return;
- }
- if (sh[now].val<=k)
- {
- x=now;
- split(sh[now].son[1],k,sh[now].son[1],y);
- }
- else
- {
- y=now;
- split(sh[now].son[0],k,x,sh[now].son[0]);
- }
- pushup(now);
- }
- int merge(int x,int y)
- {
- if (x==0)
- return y;
- if (y==0)
- return x;
- if (sh[x].key<sh[y].key)
- {
- sh[x].son[1]=merge(sh[x].son[1],y);
- pushup(x);
- return x;
- }
- else
- {
- sh[y].son[0]=merge(x,sh[y].son[0]);
- pushup(y);
- return y;
- }
- }
- int kth(int now,int k)
- {
- if (sh[sh[now].son[0]].si<k && k<=sh[sh[now].son[0]].si+sh[now].g)
- return now;
- else
- if (k<sh[sh[now].son[0]].si+sh[now].g)
- return kth(sh[now].son[0],k);
- else
- return kth(sh[now].son[1],k-sh[sh[now].son[0]].si-sh[now].g);
- }
- int find(int x)
- {
- q.clear();
- int cur;
- cur=root;
- while (sh[cur].son[x>sh[cur].val]!=0 && sh[cur].val!=x)
- q.push_back(cur),cur=sh[cur].son[x>sh[cur].val];
- q.push_back(cur);
- return cur;
- }
- void updata()
- {
- while (!q.empty())
- {
- pushup(q.back());
- q.pop_back();
- }
- }
- int main()
- {
- srand(time(0));
- root=0;
- scanf("%d",&n);
- for (int i=1;i<=n;i++)
- {
- int x,op;
- scanf("%d%d",&op,&x);
- if (op==1)
- {
- int cur=find(x);
- if (sh[cur].val==x)
- {
- sh[cur].g++;
- updata();
- }
- else
- {
- int a,b;
- split(root,x,a,b);
- root=merge(merge(a,newnode(x)),b);
- }
- }
- if (op==2)
- {
- int cur=find(x);
- sh[cur].g--;
- updata();
- if (sh[cur].g==0)
- {
- int a,b,c;
- split(root,x,a,b);
- split(a,x-1,a,c);
- c=merge(sh[c].son[0],sh[c].son[1]);
- root=merge(merge(a,b),c);
- }
- }
- if (op==3)
- {
- int a,b;
- split(root,x-1,a,b);
- printf("%d\n",sh[a].si+1);
- root=merge(a,b);
- }
- if (op==4)
- {
- printf("%d\n",sh[kth(root,x)].val);
- }
- if (op==5)
- {
- int a,b;
- split(root,x-1,a,b);
- printf("%d\n",sh[kth(a,sh[a].si)].val);
- root=merge(a,b);
- }
- if (op==6)
- {
- int a,b;
- split(root,x,a,b);
- printf("%d\n",sh[kth(b,1)].val);
- root=merge(a,b);
- }
- }
- }
模板——Fhq_treap的更多相关文章
- 「模板」 FHQ_Treap 区间翻转
「模板」 FHQ_Treap 区间翻转 没有旋转的 Treap 实现区间操作的功能,很好理解,也很好写,只是速度不算太快. 对于要翻转的区间,把整棵 Treap(存有区间 \([1,n]\) 的信息) ...
- 「模板」 FHQ_Treap
「模板」 FHQ_Treap 我也是偶然发现我还没发过FHQ_Treap的板子. 那就发一波吧. 这个速度实在不算快,但是不用旋转,并且好写. 更重要的是,Splay 可以做的事情它都可以做!比如区间 ...
- fhq_treap || BZOJ 3223: Tyvj 1729 文艺平衡树 || Luogu P3391 【模板】文艺平衡树(Splay)
题面: [模板]文艺平衡树(Splay) 题解:无 代码: #include<cstdio> #include<cstring> #include<iostream> ...
- fhq_treap || BZOJ 3224: Tyvj 1728 普通平衡树 || Luogu P3369 【模板】普通平衡树
题面:[模板]普通平衡树 代码: #include<cstdio> #include<cstring> #include<iostream> #include< ...
- [note]fhq_treap
fhq_treap 这东西据说是某个叫范浩强的神仙搞出来的, 他的这种treap可以不用旋转并且资磁很多平衡树操作, 复杂度通过随机的键值来保证(树大致平衡,期望一次操作复杂度\(logn\)) 依靠 ...
- [luogu 3369]普通平衡树(fhq_treap)
题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询x数的排名(排名定义为比当前数小的数的个数+1.若有多 ...
- P5055 【模板】可持久化文艺平衡树 可持久化fhqtreap
P5055 [模板]可持久化文艺平衡树 链接 luogu 思路 可持久化fhq-treap套一套就行了,pushdown和split都要可持久化,但merge不用可持久.以前以为很难一直没看,就是个板 ...
- 浅谈无旋treap(fhq_treap)
一.简介 无旋Treap(fhq_treap),是一种不用旋转的treap,其代码复杂度不高,应用范围广(能代替普通treap和splay的所有功能),是一种极其强大的平衡树. 无旋Treap是一个叫 ...
- Luogu P3835 【模板】可持久化平衡树(fhq Treap)
P3835 [模板]可持久化平衡树 题意 题目背景 本题为题目普通平衡树的可持久化加强版. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本 ...
随机推荐
- 081 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 06 new关键字
081 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 06 new关键字 本文知识点:new关键字 说明:因为时间紧张,本人写博客过程中只是 ...
- 028 01 Android 零基础入门 01 Java基础语法 03 Java运算符 08 逻辑“或”运算符
028 01 Android 零基础入门 01 Java基础语法 03 Java运算符 08 逻辑"或"运算符 本文知识点:Java中的逻辑"或"运算符 逻辑& ...
- Java知识系统回顾整理01基础04操作符04位操作符
一.位操作符 位操作符在实际工作中用的并不常见,但是我比较纠结这些位操作.所以实际练习位操作符的每一个操作符的操作实例来理解其具体含义. 建议: 如果确实感兴趣,就看看,个人建议跳过这个章节. 真正工 ...
- FOV
来源:https://blog.csdn.net/chepwavege/article/details/98876550 视场 (视图字段) 是指现场对面相机镜头的立体角.图如下图所示︰ 高频通气︰ ...
- PyCharm 上安装 Package(以 pandas 为例)
一.使用 PyCharm 软件安装 pandas 包 1.打开 PyCharm 2.点击右上角 "Files" →"Settings..." 3.弹出" ...
- 54.Qt-将界面程序封装成动态库DLL
1.生成dll 然后选择创建共享库: 创建好后,修改pro文件,改为下面两句(这样就可以创建界面了): 然后修改sharedlib.h: #ifndef SHAREDLIB_H #define SH ...
- Redis 的完整安装过程
Windos 版本安装 Redis 官方并不支持 Window 版本,但是微软公司在 Github 上维护了一个 Windows 版本的 Redis 项目,供 Windows 用户下载使用. 下载地址 ...
- JSX 详解
一 jsx 的本质是什么? jsx是语法糖,需要被编译成js才能运行. jsx 看似是html 结构,实质是js结构的语法糖,在代码编译阶段被编译成js结构.所以jsx的本质可描述为看似html结构的 ...
- super函数
Python面向对象中super用法与MRO机制:https://www.cnblogs.com/chenhuabin/p/10058594.html python 中 super函数的使用:http ...
- 【思维】Luogu P3941 入阵曲
题目大意 洛谷链接 给出一个矩阵和 \(K\) ,问有多少子矩阵中的元素和能整除 \(K\). 数据范围 \(2\leq n,m\leq 400\),\(0\leq K\leq 10^6\). 思路 ...