voidsplay(intx,intgoal=0){while(par[x]!=goal){inty=par[x],z=par[y];if(z!=goal){if(chk(y)==chk(x)) rotate(y);elserotate(x); } rotate(x); } //分情况讨论,这样才能使树的深度尽量小if(!goal) root=x; }//将x旋转到根,或goal的儿子 //find操作,将最大的小于等于x的子树旋转...
void rotate(int x):把节点x旋转到x父亲的位置,左旋右旋可以写在一起 void splay(int x,int goal):把x通过不断旋转,直到父亲是goal bool find(int val):找到值为val的节点,并旋转到根,返回是否成功找到 int pre():找到第一个小于根节点val的节点的编号 int nxt():找到第一个大于根节点val的节点的编号 ...
void Init():重置整棵树(删除了整棵树的时候用) int New(int val,int fa):新建一个节点,权值为val,父亲为fa,返回节点编号 void Delete(int x):清空节点x的信息 void rotate(int x):把节点x旋转到x父亲的位置,左旋右旋可以写在一起 void splay(int x,int goal):把x通过不断旋转,直到父亲是goal bool...
splay.build(); while (Q--) { int opt,x; scanf("%d%d",&opt,&x); if (opt==1) splay.ins(x); if (opt==2) splay.del(x); if (opt==3) printf("%d\n",splay.get_rank(x)); if (opt==4) printf("%d\n",splay.val[splay.get_val(x+1)]); if (opt==5) printf("%d\n"...
代码语言:javascript 复制 1011064654113177211460929164498518418518985168196814927375493598 输出样例#1: 代码语言:javascript 复制 10646584185492737 说明 时空限制:1000ms,128M 1.n的数据范围:n<=100000 2.每个数的数据范围:[-1e7,1e7] 来源:Tyvj1728 原名:普通平衡树 ...
C05【模板】FHQ Treap P3369 普通平衡树 5932播放 F04 扩展 KMP(Z 函数) 7530播放 C08 可持久化线段树(主席树) 9002播放 C16【模板】左偏树(可并堆) 3142播放 C19【模板】KD 树 交替建树 4172播放 C03【模板】Splay P3369 普通平衡树 1.2万播放 A11 树上差分 5325播放 A10 差分 二维差分 6618播放 F09...
代码语言:javascript 复制 1011064654113177211460929164498518418518985168196814927375493598 输出样例#1: 代码语言:javascript 复制 10646584185492737 说明 时空限制:1000ms,128M 1.n的数据范围:n<=100000 2.每个数的数据范围:[-1e7,1e7] 来源:Tyvj1728 原名:普通平衡树 ...
回来重新打一下Splay的板子……竟然整整调了一个上午……...[洛谷P3369]【模板】普通平衡树 题目大意:需要提供以下操作: 插入 $x$ 数 删除 $x$ 数(若有多个相同的数,应只删除一个) 查询 $x$ 数的排名(排名定义为比当前数小的数的个数 $+1$ 。若有多个相同的数,因输出最小的排名) 查询排名为 ...
P3369 【模板】普通平衡树(splay) 技术标签: splay传送门题解:平衡树的基本操作(insert,delete,find,next,pre,rank,kth)附上代码:#include<bits/stdc++.h>using namespace std;const int MAX=500000;inline int read() { register int x=0,t=1;...
解决方案是引入平衡因子,在适当的时候重建这颗树。 重构方法可以拍扁也可以旋转。 拍扁的方法就是中序遍历一遍然后重新建树(具体可以参考这里),旋转的一会儿会讲。 工具函数 这里是一些简单的重要的工具函数。 新建节点 inlinevoidnewNode(int&pos,intv){ ...