巴蜀1322 第k小的数
2016-05-22 21:27
295 查看
Description
现在已有N个整数,你有以下三种操作:1 A:表示加入一个值为A的整数;
2 B:表示删除其中值为B的整数;
3 K:表示输出这些整数中第K小的数;
Input
第一行,两个整数N,M,表示最开始有N个整数,总共有M个操作第二行用空格隔开的N个整数
接下来M行,每行表示一个操作
Output
若干行,一行一个整数,表示所求的第K小的数字平衡树模板题。
#include<cstdio> #include<cstdlib> struct node { int size,x,v,k[2]; }t[3100000]; int root,size; void up(int p) { t[p].size=t[t[p].k[0]].size+t[t[p].k[1]].size+1; } void rot(int &p,bool b) { int x=t[p].k[b]; int y=t[x].k[!b]; t[p].k[b]=y; t[x].k[!b]=p; up(p); up(x); p=x; } void ins(int &p,int x) { if (p==0) { p=++size; t[p].x=x; t[p].v=rand(); t[p].size=1; return; } if (t[p].x==x) return; bool b=x>t[p].x; ins(t[p].k[b],x); up(p); if (t[t[p].k[b]].v>t[p].v) rot(p,b); } void del(int &p,int x) { if (p==0) return; if (t[p].x==x) { if (t[p].k[0]==0&&t[p].k[1]==0) { p=0; return; } bool b=t[t[p].k[0]].v<t[t[p].k[1]].v; rot(p,b); del(t[p].k[!b],x); up(p); } del(t[p].k[x>t[p].x],x); up(p); } int find(int p,int x) { if (p==0) return 0; if (t[t[p].k[0]].size>=x) return find(t[p].k[0],x); if (t[t[p].k[0]].size+1==x) return t[p].x; return find(t[p].k[1],x-t[t[p].k[0]].size-1); } int main() { int m,n,i,j,k,x,y,z; scanf("%d%d",&n,&m); for (i=1;i<=n;i++) { scanf("%d",&x); ins(root,x); } for (i=1;i<=m;i++) { scanf("%d%d",&x,&y); if (x==1) ins(root,y); if (x==2) del(root,y); if (x==3) printf("%d\n",find(root,y)); } }
相关文章推荐
- [BZOJ3196][TYVJ3196][树套数][区间第k大]二逼平衡树
- Splay树-Codevs 1296 营业额统计
- 平衡树的插入
- bzoj3223 && Tyvj 1729 文艺平衡树
- hdu 5324 树套树、cdq分治
- 算法与数据结构八日谈之六——数据结构专题(uncompleted)
- 小练习,splay区间反转
- splay区间翻转及删除区间,平移区间
- splay的入门
- 偷懒专用平衡树——Treap
- 把排序数组转换为高度最小的二叉搜索树(LintCode)
- 【JSOI2008】【BZOJ1014】火星人prefix
- cc150:判断一棵树是否为平衡树
- UVA11990 ``Dynamic'' Inversion (树状数组套平衡树)
- hdu5592 线段树
- hdu 4699 Editor 伸展树 treap复习
- bzoj 1588 [HNOI2002]营业额统计
- bzoj 1503 [NOI2004]郁闷的出纳员 平衡树(treap/Splay)
- 数据结构系列之平衡树(DSW法构建)
- HDU 5475 平衡树/线段树