Splay模板

来源:互联网 发布:美国网络课程 有学位吗 编辑:程序博客网 时间:2024/05/16 08:00
码着。。写死我了,这个板子貌似效率很低
struct node{int ch[2],fa,cont,siz,w;bool isup;};struct spt{int root,tot;node sp[200005];void rot(int now,int isl){int fa = sp[now].fa;sp[now].fa = sp[fa].fa;if(fa==root){root=now;}else{sp[sp[fa].fa].ch[fa==sp[sp[fa].fa].ch[1]]=now;}sp[fa].ch[isl] = sp[now].ch[!isl];if(sp[now].ch[!isl]) sp[sp[now].ch[!isl]].fa = fa;sp[now].ch[!isl] = fa; sp[fa].fa = now;sp[fa].siz = sp[sp[fa].ch[0]].siz+sp[sp[fa].ch[1]].siz+sp[fa].cont;sp[now].siz = sp[sp[now].ch[0]].siz+sp[sp[now].ch[1]].siz+sp[now].cont;}void splay(int now){while(sp[now].fa){int fa = sp[now].fa;if(!sp[fa].fa){rot(now,now==sp[fa].ch[1]);return;}int fafa = sp[fa].fa;if(fa==sp[fafa].ch[0]){if(now==sp[fa].ch[0]){rot(fa,0);rot(now,0);}else{rot(now,1);rot(now,0);}}else{if(now==sp[fa].ch[1]){rot(fa,1);rot(now,1);}else{rot(now,0);rot(now,1);}}}}void ins(int w,bool isup){int now = root; int fa=0;while(1){//printf("now %d w %d lc %d rc %d\n",now,sp[now].w,sp[now].ch[0],sp[now].ch[1]);if(now&&sp[now].w==w){sp[now].cont++;sp[now].siz++;splay(now);return;}if(!now){sp[++tot].w = w;sp[tot].isup = isup; sp[tot].cont = sp[tot].siz =1;sp[tot].fa = fa;sp[fa].ch[w>sp[fa].w] = tot;splay(tot);return;}fa = now; now = sp[now].ch[w>sp[now].w];}}void que(int w){int now = root;while(1){if(sp[now].w==w){splay(now);return;}now = sp[now].ch[w>sp[now].w];}}void del(int w){int now = root;while(1){if(sp[now].w==w){splay(now); sp[now].cont--;sp[now].siz--;if(!sp[now].cont){if(sp[now].ch[1]){root = sp[now].ch[1];sp[root].fa = 0;if(sp[now].ch[0]){int pr = sp[now].ch[1];while(sp[pr].ch[0]){pr=sp[pr].ch[0];}sp[sp[now].ch[0]].fa = pr;sp[pr].ch[0] = sp[now].ch[0];splay(sp[now].ch[0]);}}else if(sp[now].ch[0]){root = sp[now].ch[0];sp[root].fa = 0;}}return;}now = sp[now].ch[w>sp[now].w];}}void mid(int now){if(now){mid(sp[now].ch[0]);printf("now %d w %d lc %d rc %d cont %d siz %d\n",now,sp[now].w,sp[now].ch[0],sp[now].ch[1],sp[now].cont,sp[now].siz);mid(sp[now].ch[1]);}} };

0 0
原创粉丝点击