首页 > 代码库 > treap
treap
#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#include<iostream>#define MAXMOD 999983#define maxn 1111111using namespace std;int n,m,v,root,tot,a[maxn],l[maxn],r[maxn],data[maxn],num[maxn];int RR(int x){ int y=l[x]; l[x]=r[y]; r[y]=x; return y;}int LR(int x){ int y=r[x]; r[x]=l[y]; l[y]=x; return y;}int insert(int root,int key){ if (!(root+1)) { num[tot++]=rand()%MAXMOD; data[tot]=key; l[tot]=r[tot]=-1; return tot; } if (key<data[root]) { l[root]=insert(l[root],key); if (num[l[root]]>num[root]) root=RR(root); } else { r[root]=insert(r[root],key); if (num[r[root]]>num[root]) root=LR(root); } return root;}int delete1(int root,int key){ if (key<data[root]) { l[root]=delete1(l[root],key); return root; } else if (key>data[root]) { r[root]=delete1(r[root],key); return root; } else { if (l[root]==-1 && r[root]==-1) return -1; if (l[root]!=-1 && (r[root]!=-1 && num[l[root]]>num[r[root]] || r[root]==-1)) { root=RR(root); r[root]=delete1(r[root],key); return root; } if (r[root]!=-1 && (l[root]!=-1 && num[r[root]]>num[l[root]] || l[root]==-1)) { root=LR(root); l[root]=delete1(l[root],key); return root; } }}void dfs(int x){ if (l[x]+1) dfs(l[x]); printf("%d ",data[x]); if (r[x]+1) dfs(r[x]);}int main(){ freopen("1.in","r",stdin); freopen("1.out","w",stdout); srand(time(0)); scanf("%d",&n); for (int i=0;i<n;i++) l[i]=r[i]=-1; root=-1; for (int i=0;i<n;i++) { scanf("%d",&a[i]); root=insert(root,a[i]); } dfs(root); cout<<"\n"; scanf("%d",&m); for (int i=0;i<m;i++) { scanf("%d",&v); root=delete1(root,v); dfs(root); cout<<"\n"; } dfs(root); return 0;}
treap
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。