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"...
P3369 【模板】普通平衡树(Treap/SBT) 2017-07-29 20:03 −... ANhour 0 240 平衡树(Splay、fhq Treap) 2019-12-02 17:27 −##Splay Splay(伸展树)是一种二叉搜索树。 其复杂度为**均摊**$O(n\log n)$,所以并不可以可持久化。 Splay的核心操作有两个:rotate和splay。 ###pushup: 上传信息...
代码语言: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...
洛谷P3391 【模板】文艺平衡树(Splay)(FHQ Treap) 数据结构二叉树编程算法 题目背景这是一道经典的Splay模板题——文艺平衡树。题目描述您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 ...
(x); } inline void splay(int x) { for(int f;f=fa[x];rotate(x)) if(fa[f]){ if(get(x)==get(f)) rotate(f); else rotate(x); } root=x; } inline void insert(int x) { if(!root) { sz++;root=sz; node[sz][0]=node[sz][1]=fa[sz]=0; size[sz]=cnt[sz]=1; key...
splay(rt,p); } ptr find(int s){ ptr p=rt; while(p->s!=s&&p->son(s)!=e)p=p->son(s); return splay(rt,p); } ptr lst(int s){ ptr p=find(s); if(p->s<s)return p; p=p->lc;while(p->rc!=e)p=p->rc;