博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
普通平衡树(指针splay)
阅读量:4329 次
发布时间:2019-06-06

本文共 8963 字,大约阅读时间需要 29 分钟。

最早的板子,学自Ez大佬:

1 #include
2 #include
3 using namespace std; 4 5 class Splay{ 6 public: 7 Splay(){ 8 root=NULL; 9 for(top;top
cnt,update(root); 15 else if(root==NULL) 16 root=newnode(val,NULL); 17 else splay(insert(root,val),NULL); 18 } 19 inline void erase(int val){ 20 if(find(val)!=NULL) erase(root,1); 21 } 22 inline int rnk(int val){ 23 if(find(val)!=NULL) return size(root->son[0])+1; 24 else return 0; 25 } 26 inline int qry(int kth){ 27 if(size(root)
size(t->son[0])){ 30 kth-=size(t->son[0]); 31 if(kth<=t->cnt) 32 return t->v; 33 else kth-=t->cnt,t=t->son[1]; 34 } 35 else t=t->son[0]; 36 } 37 } 38 inline int prv(int val){ 39 int ret=-0x7fffffff; 40 for(node *t=root;t;){ 41 if(t->v
v) 43 ret=t->v; 44 } 45 t=t->son[val>t->v]; 46 } 47 return ret; 48 } 49 inline int nxt(int val){ 50 int ret=0x7fffffff; 51 for(node *t=root;t;){ 52 if(t->v>val){ 53 if(ret>t->v) 54 ret=t->v; 55 } 56 t=t->son[val>=t->v]; 57 } 58 return ret; 59 } 60 private: 61 struct node{ 62 int v,cnt,siz; 63 node *son[2],*f; 64 node(){son[0]=son[1]=f=NULL;v=cnt=siz=0;} 65 }*root; 66 const static int siez=100100; 67 node *stk[siez],tree[siez];int top; 68 inline node * newnode(int v,node *f){ 69 node *t=stk[--top]; 70 t->siz=t->cnt=1;t->v=v; 71 t->son[1]=t->son[0]=NULL; 72 t->f=f; 73 return t; 74 } 75 inline void freenode(node *t){ 76 stk[top++]=t; 77 } 78 inline int size(node* t){ 79 return t==NULL?0:t->siz; 80 } 81 inline void update(node *t){ 82 if(t!=NULL) 83 t->siz=t->cnt+size(t->son[0])+size(t->son[1]); 84 } 85 86 inline bool son(node* f,node* s){ 87 if(f==NULL) return 0; 88 return f->son[1]==s; 89 } 90 inline void connect(node *f,node *s,bool k){ 91 if(f!=NULL) f->son[k]=s; 92 else root=s; 93 if(s!=NULL) s->f=f; 94 } 95 inline void rotate(node* t){ 96 node *f=t->f,*g=f->f; 97 bool a=son(f,t),b=!a; 98 connect(f,t->son[b],a); 99 connect(g,t,son(g,f));100 connect(t,f,b);101 update(f);102 update(t);103 }104 inline void splay(node *t,node *p){105 if(t){106 while(t->f!=p){107 node *f =t->f,*g=f->f;108 if(g==p) rotate(t);109 else{110 if(son(g,f)^son(f,t))111 rotate(t),rotate(t);112 else113 rotate(f),rotate(t);114 }115 }116 }117 }118 inline node *find(int val){119 node *t=root;120 while(t!=NULL &&t->v!=val){121 t=t->son[val>=t->v];122 }123 return splay(t,NULL ),t;124 }125 node *insert(node *t,int val){126 node *ret=t->son[val>=t->v];127 if(ret==NULL)128 ret=t->son[val>=t->v]=newnode(val,t);129 else ret=insert(ret,val);130 return update(t),ret;131 }132 inline void erase(node *t){133 if(t->son[0]==NULL)134 connect(NULL ,t->son[1],0),update(root);135 else if(t->son[1]==NULL){136 connect(NULL,t->son[0],1),update(root);137 }138 else{139 node *p=t->son[0];140 while(p->son[1]!=NULL) p=p->son[1];141 splay(p,t);142 connect(NULL,p,0);143 connect(p,t->son[1],1);144 update(root);145 }146 freenode(t);147 }148 inline void erase(node *t ,int k){149 t->cnt-=k;150 if(t->cnt<=0) erase(t);151 else update(t);152 }153 }s;154 int main(){155 freopen("phs.in","r",stdin);156 freopen("phs.out","w",stdout);157 int n,op,x;158 scanf("%d",&n);159 while(n--){160 scanf("%d%d",&op,&x);161 switch(op){162 case 1: s.insert(x);163 break;164 case 2 :s.erase(x);165 break;166 case 3: printf("%d\n",s.rnk(x));167 break;168 case 4:printf("%d\n",s.qry(x));169 break;170 case 5:printf("%d\n",s.prv(x));171 break;172 default:printf("%d\n",s.nxt(x));173 break;174 }175 }176 }
The old

自己修改的板子(其实没变化):

1 #define Troy  2   3 #include "bits/stdc++.h"  4   5 #define inf 0x7fffffff  6   7 using namespace std;  8   9 inline int read(){ 10     int s=0,k=1;char ch=getchar(); 11     while(ch<'0'|ch>'9')    ch=='-'?k=-1:0,ch=getchar(); 12     while(ch>47&ch<='9')    s=s*10+(ch^48),ch=getchar(); 13     return s*k; 14 } 15  16 const int N=2e5+5; 17  18 #define size(t) (t?t->size:0) 19 #define son(f,s)    (f?f->son[1]==s:0) 20 #define update(t)    (t?t->size=t->cnt+size(t->son[0])+size(t->son[1]):0) 21  22 class Splay{ 23 public: 24     Splay(){
for(root=NULL;top
cnt,update(root); 28 else if(root) splay(insert(root,val),NULL); 29 else root=newnode(val,NULL); 30 } 31 32 inline void erase(int val){
if(find(val)) erase(root,1);} 33 34 inline int rnk(int val){ 35 if(find(val)) return size(root->son[0])+1; 36 else return 0; 37 } 38 39 inline int qry(int kth){ 40 if(size(root)
size(t->son[0])){ 43 kth-=size(t->son[0])+t->cnt; 44 if(kth<=0) return t->val; 45 else t=t->son[1]; 46 }else t=t->son[0]; 47 } 48 49 inline int prv(int val){ 50 int ret=-inf; 51 for(node *t=root;t;t=t->son[val>t->val]) 52 if(t->val
val) ret=t->val; 53 return ret; 54 } 55 56 inline int nxt(int val){ 57 int ret=inf; 58 for(node *t=root;t;t=t->son[val>=t->val]) 59 if(t->val>val&&ret>t->val) ret=t->val; 60 return ret; 61 } 62 private: 63 struct node{ 64 node *f,*son[2]; 65 int val,cnt,size; 66 }tree[N],*root,*stk[N];int top; 67 68 inline node* newnode(int val,node *f){ 69 node *t=stk[--top];*t=(node){f,NULL,NULL,val,1,1}; 70 return t; 71 } 72 73 inline void freenode(node *t){stk[top++]=t;} 74 75 inline void connect(node *f,node *s,int k){ 76 if(f) f->son[k]=s;else root=s; 77 if(s) s->f=f; 78 } 79 80 inline void rotate(node *t){ 81 node *f=t->f,*g=f->f;int a=son(f,t),b=!a; 82 connect(f,t->son[b],a); 83 connect(g,t,son(g,f)); 84 connect(t,f,b); 85 update(f),update(t); 86 } 87 88 inline void splay(node *t,node *p){ 89 if(t)for(;t->f!=p;rotate(t)) 90 if(t->f->f!=p) rotate(son(t->f,t)==son(t->f->f,t->f)?t->f:t); 91 } 92 93 inline node *find(int val){ 94 node *t=root; 95 for(;t&&t->val!=val;t=t->son[val>=t->val]); 96 return splay(t,NULL),t; 97 } 98 99 inline node *insert(node *t,int val){100 node *ret=t->son[val>=t->val];101 if(ret) ret=insert(ret,val);else ret=t->son[val>=t->val]=newnode(val,t);102 return update(t),ret;103 }104 105 inline void erase(node *t){106 if(t->son[0]==NULL) connect(NULL,t->son[1],0);107 else if(t->son[1]==NULL) connect(NULL,t->son[0],0);108 else {node *p=t->son[0];109 while(p->son[1]) p=p->son[1];110 splay(p,t);111 connect(NULL,p,0),connect(p,t->son[1],1);112 }update(root),freenode(t);113 }114 115 inline void erase(node *t,int k){116 t->cnt-=k;117 if(t->cnt<=0) erase(t);else update(t);118 }119 }s;120 int main(){121 freopen("phs.in","r",stdin);122 freopen("phs.out","w",stdout);123 int n,op,x;124 n=read();125 while(n--){126 op=read(),x=read();127 switch(op){128 case 1: s.insert(x);129 break;130 case 2 :s.erase(x);131 break;132 case 3:printf("%d\n",s.rnk(x));133 break;134 case 4:printf("%d\n",s.qry(x));135 break;136 case 5:printf("%d\n",s.prv(x));137 break;138 default:printf("%d\n",s.nxt(x));139 break;140 }141 }142 }

 

转载于:https://www.cnblogs.com/Troywar/p/7233317.html

你可能感兴趣的文章
CTP2交易所成交回报
查看>>
WebSocket & websockets
查看>>
openssl 升级
查看>>
ASP.NET MVC:通过 FileResult 向 浏览器 发送文件
查看>>
CVE-2010-2883Adobe Reader和Acrobat CoolType.dll栈缓冲区溢出漏洞分析
查看>>
使用正确的姿势跨域
查看>>
AccountManager教程
查看>>
Android学习笔记(十一)——从意图返回结果
查看>>
算法导论笔记(四)算法分析常用符号
查看>>
ultraedit激活
查看>>
总结(6)--- python基础知识点小结(细全)
查看>>
亿级曝光品牌视频的幕后设定
查看>>
ARPA
查看>>
JSP开发模式
查看>>
我的Android进阶之旅------&gt;Android嵌入图像InsetDrawable的使用方法
查看>>
Detours信息泄漏漏洞
查看>>
win32使用拖放文件
查看>>
Android 动态显示和隐藏软键盘
查看>>
raid5什么意思?怎样做raid5?raid5 几块硬盘?
查看>>
【转】how can i build fast
查看>>