无旋treap模板 数组版
2017-10-07 09:59
399 查看
简单的找第k大数。
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<ctime> using namespace std; int getint() { int i=0,f=1;char c; for(c=getchar();(c<'0'||c>'9')&&c!='-';c=getchar()); if(c=='-')c=getchar(),f=-1; for(;c>='0'&&c<='9';c=getchar())i=(i<<3)+(i<<1)+c-'0'; return i*f; } const int N=10005; int n,k,root,L,R; int a ; int tot,val ,pri ,size ,son [2]; int upt(int u) { size[u]=size[son[u][0]]+size[son[u][1]]+1; return u; } int merge(int u,int v) { if(!u)return upt(v); if(!v)return upt(u); if(pri[u]<pri[v]) { son[u][1]=merge(son[u][1],v); return upt(u); } else { son[v][0]=merge(u,son[v][0]); return upt(v); } } void Split(int u,int v,int &L,int &R) { if(!u) { L=R=0; return; } if(val[u]<=v) { Split(son[u][1],v,L,R); son[u][1]=0,upt(u); L=merge(u,L); } else { Split(son[u][0],v,L,R); son[u][0]=0,upt(u); R=merge(R,u); } } int Insert(int u,int v) { L=R=0; Split(u,v,L,R); val[++tot]=v,pri[tot]=rand(); return merge(merge(L,tot),R); } void Split_Kth(int u,int kth,int &L,int &R) { if(!u) { L=R=0; return; } if(size[son[u][0]]<kth) { Split_Kth(son[u][1],kth-size[son[u][0]]-1,L,R); son[u][1]=0,upt(u); L=merge(u,L); } else { Split_Kth(son[u][0],kth,L,R); son[u][0]=0,upt(u); R=merge(R,u); } } int main() { //freopen("lx.in","r",stdin); srand(time( 126a9 0)); n=getint(),k=getint(); for(int i=1;i<=n;i++)a[i]=getint(); for(int i=1;i<=n;i++) root=Insert(root,a[i]); L=R=0; Split_Kth(root,k,L,R); int pos=L; while(son[pos][1]) pos=son[pos][1]; cout<<val[pos]; root=merge(L,R); return 0; }
相关文章推荐
- 数组splay ------ luogu P3369 【模板】普通平衡树(Treap/SBT)
- [模板] 树堆 - Treap的指针和数组实现及一些例题
- 【模板】treap(数组)
- 维护集合Ⅰ【无旋Treap数组模板】
- 洛谷P3374 【模板】树状数组 1(CDQ分治)
- 模板与范型编程(非类型模板形参),数组初始化
- 【后缀数组】洛谷P3809模板题
- 【NOIP模板】 树状数组
- 模板——无旋Treap
- 第14周项目4-数组类模板
- 二维树状数组模板
- 树状数组 (模板)
- nyoj-123 士兵杀敌(四) (树状数组插线问点—模板题)
- poj1195及二维树状数组模板
- 树状数组【模板】
- [Luogu 3919]【模板】可持久化数组(可持久化线段树/平衡树)
- thinkphp模板中数组的输出
- 【模板】树状数组 1
- P3369 【模板】普通平衡树(Treap/SBT)
- 利用模板实现简单的栈类(数组和单链表)