【模板】普通平衡树(Treap/SBT) 洛谷 3369 splay
2018-02-04 15:55
661 查看
题目
您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:插入x数
删除x数(若有多个相同的数,因只删除一个)
查询x数的排名(排名定义为比当前数小的数的个数+1。若有多个相同的数,因输出最小的排名)
查询排名为x的数
求x的前驱(前驱定义为小于x,且最大的数)
求x的后继(后继定义为大于x,且最小的数)
分析
splay模板ps:我保证这次的模板绝对不会错了
code
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<string> #include<algorithm> #include<stack> #include<queue> #include<vector> #include<ctime> using namespace std; const int N=1000005; const int inf=0X7fffffff; const int mod=1000000; struct tree{ int l,r; int fa,k; int s; }t ; int n; int delta,ans; int root=0,tot; long long num=0; int read() { int x=0,v=1; char ch=getchar(); for (;ch<'0'||ch>'9';v=(ch=='-')?(-1):(v),ch=getchar()); for (;ch<='9'&&ch>='0';x=x*10+ch-'0',ch=getchar()); return x*v; } void clean(int x) { t[x].l=t[x].r=t[x].fa=t[x].k=t[x].s=0; } void rttl(int x) { int y=t[x].r; if (x==root) root=y; t[x].r=t[y].l; t[t[y].l].fa=x; t[y].l=x; t[y].fa=t[x].fa; if (x==t[t[x].fa].l) t[t[x].fa].l=y; else t[t[x].fa].r=y; t[x].fa=y; t[x].s=t[t[x].l].s+t[t[x].r].s+1; t[y].s=t[t[y].l].s+t[t[y].r].s+1; } void rttr(int x) { int y=t[x].l; if (x==root) root=y; t[x].l=t[y].r; t[t[y].r].fa=x; t[y].r=x; t[y].fa=t[x].fa; if (x==t[t[x].fa].l) t[t[x].fa].l=y; else t[t[x].fa].r=y; t[x].fa=y; t[x].s=t[t[x].l].s+t[t[x].r].s+1; t[y].s=t[t[y].l].s+t[t[y].r].s+1; } void splay(int x,int flag) { if (x==0) return; while (x!=root) { int f=t[x].fa; if (f==x) return; if ((flag)&&(f==root)) return; if ((flag)&&(t[f].fa==root)) { if (x==t[f].l) rttr(f); else rttl(f); return; } if (f==root) if (x==t[f].l) rttr(f); else rttl(f); else { int p=t[f].fa; if (x==t[f].l) { if (f==t[p].l) {rttr(p); rttr(f);} else {rttr(f); rttl(p);} } else { if (f==t[p].l) {rttl(f); rttr(p);} else {rttl(p); rttl(f);} } } } } void insert(int k) { if (!root) { root=++tot; t[tot].s=1; t[tot].k=k; return; } int x=root,y; while (x) { y=x; t[x].s++; if ((x==t[x].l)||(x==t[x].r)) break; if (k<t[x].k) x=t[x].l; else x=t[x].r; } t[++tot].s=1; t[tot].k=k; t[tot].fa=y; if (k<t[y].k) t[y].l=tot; else t[y].r=tot; splay(tot,0); } int find(int k) { int x=root,y; while (x) { y=x; if (t[x].k==k) break; if (k<=t[x].k) x=t[x].l; else x=t[x].r; } splay(y,0); return y; } int findnumber(int k) { int x=root,y; int ans=0; while (x) { y=x; /*if ((t[x].k==k)&&(t[t[x].l].k!=k)) { ans+=t[t[x].l].s+1; break; }*/ if (k<=t[x].k) x=t[x].l; else ans+=t[t[x].l].s+1,x=t[x].r; } return ans+1; } int findline(int k) { int x=root,y; while (x) { y=x; if ((t[t[x].l].s+1)==k) break; if (k<=t[t[x].l].s) x=t[x].l; else k=k-(t[t[x].l].s+1),x=t[x].r; } splay(y,0); return y; } int get_pre(int k) { int x=root; int y=0; while (x) { if (t[x].k<k) { y=x; x=t[x].r; } else x=t[x].l; } if (y) splay(y,0); return y; } int get_nex(int k) { int x=root; int y=0; while (x) { if (t[x].k>k) { y=x; x=t[x].l; } else x=t[x].r; } if (y) splay(y,0); return y; } void del(int x) { splay(x,0); if (t[x].l==0) { root=t[x].r; t[root].fa=0; return; } int xx=t[root].l; while (t[xx].r) xx=t[xx].r; splay(xx,1); t[xx].r=t[root].r; t[xx].s=t[root].s-1; t[xx].fa=0; t[t[root].r].fa=xx; clean(root); root=xx; } int main() { //freopen("p3369.out","w",stdout); n=read(); int xx=0; for (int i=1;i<=n;i++) { clean(0); int flag,x; flag=read(); x=read(); if (flag==1) { insert(x); continue; } if (flag==2) { del(find(x)); continue; } //printf("%d ",flag); if (flag==3) { printf("%d\n",findnumber(x)); } if (flag==4) { printf("%d\n",t[findline(x)].k); } if (flag==5) { printf("%d\n",t[get_pre(x)].k); } if (flag==6) { printf("%d\n",t[get_nex(x)].k); } } //printf("233 233"); }
相关文章推荐
- BZOJ 3224 洛谷 3369 【模板】普通平衡树(Treap/SBT)
- 洛谷P3369 【模板】普通平衡树(Treap/SBT)
- 洛谷 P3369 【模板】普通平衡树(Treap/SBT)
- AC日记——【模板】普通平衡树(Treap/SBT) 洛谷 P3369
- 洛谷P3369 【模板】普通平衡树(Treap/SBT)
- 【模板】【Treap/SBT】【树堆】普通平衡树【洛谷P3369】
- 洛谷 P3369 【模板】普通平衡树(Treap/SBT)
- Splay练习1——P3369 【模板】普通平衡树(Treap/SBT)
- 数组splay ------ luogu P3369 【模板】普通平衡树(Treap/SBT)
- 洛谷 P3369 BZOJ 3224 【模板】普通平衡树(Treap/SBT)
- BZOJ3224:普通平衡树(含SBT、Treap、Splay模板)
- BZOJ3224:普通平衡树(含SBT、Treap、Splay模板)
- 洛谷.3369.[模板]普通平衡树(fhq Treap)
- 洛谷P3369 【模板】普通平衡树(Treap/SBT)
- 【模板】bzoj-3224普通平衡树(splay&treap&SBT)
- 洛谷 3369 普通平衡树 splay模板
- 洛谷.3369.[模板]普通平衡树(Splay)
- 在洛谷3369 Treap模板题 中发现的Splay详解
- P3369 【模板】普通平衡树(Treap/SBT)
- P3369 【模板】普通平衡树(Treap/SBT)