Treap模板
Posted profish
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Treap模板相关的知识,希望对你有一定的参考价值。
非指针Treap
#include<bits/stdc++.h> #define fi first #define se second #define INF 0x3f3f3f3f #define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0) #define pqueue priority_queue #define NEW(a,b) memset(a,b,sizeof(a)) const double pi=4.0*atan(1.0); const double e=exp(1.0); const int maxn=3e6+8; typedef long long LL; typedef unsigned long long ULL; //typedef pair<LL,LL> P; const LL mod=1e9+7; const ULL base=1e7+7; using namespace std; struct node{ int son[2]; int siz; int key,w; }a[100008]; int tot=0; int root=0; void up(int i){ a[i].siz=a[a[i].son[0]].siz+a[a[i].son[1]].siz+1; } void Rotate(int &i,int d){ int t=a[i].son[d]; a[i].son[d]=a[t].son[!d]; a[t].son[!d]=i; up(i);up(t); i=t; } void Insert(int &i,int key){ if(i==0){ i=++tot; a[i].siz=1;a[i].key=key;a[i].w=rand(); return ; } a[i].siz++; if(a[i].key>=key) { Insert(a[i].son[0],key); if(a[a[i].son[0]].w<a[i].w) Rotate(i,0); } else{ Insert(a[i].son[1],key); if(a[a[i].son[1]].w<a[i].w) Rotate(i,1); } } void Del(int &i,int key){ if(a[i].key==key){ if(a[i].son[0]*a[i].son[1]==0) {i=a[i].son[0]+a[i].son[1];return ;} if(a[a[i].son[0]].w>a[a[i].son[1]].w){ Rotate(i,1); Del(a[i].son[0],key); } else{ Rotate(i,0); Del(a[i].son[1],key); } } else if(a[i].key>key){ Del(a[i].son[0],key); } else{ Del(a[i].son[1],key); } up(i); } int Find(int i,int key){ if(i==0) return 1; if(a[i].key>=key) return Find(a[i].son[0],key); else return a[a[i].son[0]].siz+Find(a[i].son[1],key)+1; } int Search(int i,int rak){ if(a[a[i].son[0]].siz==rak-1) return a[i].key; if(a[a[i].son[0]].siz>=rak) return Search(a[i].son[0],rak); else return Search(a[i].son[1],rak-a[a[i].son[0]].siz-1); } int pre(int i,int key){ if(i==0) return -10000008; if(a[i].key<key) return max(a[i].key,pre(a[i].son[1],key)); return pre(a[i].son[0],key); } int bhe(int i,int key){ if(i==0) return 10000008; if(a[i].key>key) return min(a[i].key,bhe(a[i].son[0],key)); return bhe(a[i].son[1],key); } int main(){ int n; scanf("%d",&n); int opt,x; while(n--){ scanf("%d%d",&opt,&x); if(opt==1){ Insert(root,x); } if(opt==2){ Del(root,x); } if(opt==3){ printf("%d ",Find(root,x)); } if(opt==4){ printf("%d ",Search(root,x)); } if(opt==5){ printf("%d ",pre(root,x)); } if(opt==6){ printf("%d ",bhe(root,x)); } } }
以上是关于Treap模板的主要内容,如果未能解决你的问题,请参考以下文章