splay(cur); } //插入操作 voidinsert(intx){intcur=root,p=0;while(cur&&val[cur]!=x){ p=cur; cur=ch[cur][x>val[cur]]; }if(cur){ cnt[cur]++; }else{ cur=++ncnt;if(p) ch[p][x>val[p]]=cur; ch[cur][0]=ch[cur][1]=0; val[cur]=x,par[cur]=p; cnt[cur]=size[c...
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...
int a = pre(x), b = nxt(x); splay(a, 0); splay(b, a); int now = t[b].ch[0]; if(t[now].cnt > 1) t[now].cnt--, splay(now, 0); else t[b].ch[0] = 0; } 1. 2. 3. 4. 5. 6. 7. 8. 3.查询\(x\)数的排名(数据保证\(x\)存在) 有一个很棒的做法是查找...
void push(int s){ ptr p=rt,las=e; while(p!=e&&p->s!=s)las=p,p=(s<p->s?p->lc:p->rc); if(p!=e)++p->c; else{ p=e+(++tot),p->sz=p->c=1,p->fa=las,p->s=s; if(las!=e)(s<las->s?las->lc:las->rc)=p; } splay...
(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...
luogu P3369 【模板】普通平衡树(splay) 万世开 嘟嘟嘟 突然觉得splay挺有意思,唯一不足的是这几天是一天一道,debug到崩溃。 做了几道平衡树基础题后,对这题有莫名的自信,还算愉快的敲完了代码后,发现样例都过不去,然后就陷入了无限的debug环节了……算了,伤心的事就别再提了。
洛谷P3369 【模板】普通平衡树 Treap/Splay 写一个数据结构来提供以下操作: 插入xx 删除xx(多个相同则只删除一个) 查询xx的排名(从11开始数) 查询排名为xx的数 求xx的前驱 (前驱定义为max{k∣k<x}max{k∣k<x}) 求xx的后继 (后继定义为min{k∣k>x}min{k∣k>x})...
P3369 【模板】普通平衡树(splay) P3369 【模板】普通平衡树 就是不用treap splay板子,好好背吧TAT #include<iostream>#include<cstdio>#include<cstring>usingnamespacestd;#defineN 100005intn,cnt,rt,ans,q1,q2;structdata{intv,ch[2],fa,siz;}a[100005];#definelc a[o].ch[0]#definerc a[o]....
Splay P3369 【模板】普通平衡树(Treap/SBT) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询x数的排名(排名定义为比当前数小的数的个数+1。若有多个相同的数,因输出最小的排名) 查询排名为x的数 求x的...