[BST-SBT]POJ_3481_double queue
来源:互联网 发布:西安seo顾问 编辑:程序博客网 时间:2024/05/16 11:21
题意:裸的平衡树题
平衡树功能:插入,删除最大,删除最小
挂一个SBT模板吧,明天就校赛了,所以重写了一下SBT,把原来的删除操作改了下:
#include<iostream>#include<cstdio>using namespace std;const int MAXN = 1111111,INF = 10000001;struct Key{ int k,p; Key(){} Key(int kk,int pp):k(kk),p(pp){} bool operator < (const Key &ke) const{ return p<ke.p; } bool operator >= (const Key &ke) const{ return !(*this<ke); } bool operator == (const Key &ke) const{ return p==ke.p; }}k[MAXN];int l[MAXN],r[MAXN],pool[MAXN],size[MAXN],T,top,node;void build(){ T = top = node = 0;}void left_rotate(int &x){ int q = r[x]; r[x] = l[q]; l[q] = x; size[q] = size[x]; size[x] = size[l[x]]+size[r[x]]+1; x = q;}void right_rotate(int &x){ int q = l[x]; l[x] = r[q]; r[q] = x; size[q] = size[x]; size[x] = size[l[x]]+size[r[x]]+1; x = q;}int newnode(Key key){ int x; if(top!=0){ x = pool[--top]; }else{ x = ++node; } k[x] = key; size[x] = 1; l[x] = r[x] = 0; return x;}void delnode(int x){ pool[top++] = x; size[x] = l[x] = r[x] = 0;}void Maintain(int &T,bool flag){ if(!flag){ if(size[l[l[T]]]>size[r[T]]){ right_rotate(T); }else if(size[r[l[T]]]>size[r[T]]){ left_rotate(l[T]); right_rotate(T); }else{ return; } }else{ if(size[r[r[T]]]>size[l[T]]){ left_rotate(T); }else if(size[l[r[T]]]>size[l[T]]){ right_rotate(r[T]); left_rotate(T); }else{ return; } } Maintain(l[T],0); Maintain(r[T],1); Maintain(T,0); Maintain(T,1);}void Insert(int &T,Key key){ if(!T){ T = newnode(key); return; } size[T]++; if(key<k[T])Insert(l[T],key); else Insert(r[T],key); Maintain(T,key>=k[T]);}Key Delete(int &T,Key key){ if(!T)return Key(INF,INF);//no element to delete size[T]--; if((key==k[T])||(key<k[T]&&l[T]==0)||(key>=k[T]&&r[T]==0)){ Key ret = k[T]; int x = T; if(l[T]==0||r[T]==0){ T = l[T]+r[T]; delnode(x);//释放结点内存 }else{ key.p++; k[T] = Delete(r[T],key); } return ret; } if(key<k[T])Delete(l[T],key); else Delete(r[T],key);}Key DeleteMax(int &T){ if(!T)return Key(INF,INF); if(r[T])return DeleteMax(r[T]); int x = T; Key key = k[T]; T = l[T]; delnode(x); return key;}Key DeleteMin(int &T){ if(!T)return Key(INF,INF); if(l[T])return DeleteMin(l[T]); int x = T; Key key = k[T]; T = r[T]; delnode(x); return key;}Key Select(int T,int st){ if(!T)return Key(INF,INF); int rank = size[l[T]]+1; if(st==rank)return k[T]; else if(st<rank)return Select(l[T],st); else return Select(r[T],st-rank);}int Rank(int T,Key key){ if(!T)return -1; if(key==k[T])return size[l[T]]+1; else if(key<K[T])return Rank(l[T],key); else return size[l[T]]+1+Rank(r[T],key);}int main(){ int op,rst,sec; build(); //freopen("out.txt","w",stdout); while(scanf("%d",&op),op){ if(op==1){ scanf("%d%d",&rst,&sec); Insert(T,Key(rst,sec)); }else if(op==2){ Key key = Select(T,size[T]); if(key.k==INF)printf("0\n"); else printf("%d\n",key.k); Delete(T,key); }else{ Key key = Select(T,1); if(key.k==INF)printf("0\n"); else printf("%d\n",key.k); Delete(T,key); } } return 0;}
- [BST-SBT]POJ_3481_double queue
- poj3481Double Queue SBT
- POJ 3481 Double Queue【SBT】
- poj 3481 Double Queue (SBT)
- 【SBT】 POJ 3481 Double Queue
- POJ 3481 HDU1908 Double Queue SBT
- poj 3481 Double Queue(SBT解法)
- poj 3481 Double Queue(平衡树,SBT)
- POJ 3481 Double Queue SBT || treap
- 从BST到SBT(田劲峰老师论文读后感)6.
- 平衡二叉树SBT+map+treap(poj3481Double Queue)
- POJ 题目3481 Double Queue(SBT ro map)
- SBT
- SBT
- SBT!!
- SBT
- SBT
- SBT
- NFS mount 花那么多时间,怎么办?
- php global 详解
- 常用外链地址整理
- 安装ORACAL时的错误提示:加载数据库时出错:areasQueries
- 安全彻底删除oracle 9i
- [BST-SBT]POJ_3481_double queue
- DNS报文格式分析
- YUI 官网,HTML元素查询
- HTTP POST GET 本质区别详解
- TableLayout中stretchColumns、shrinkColumns的用法
- NS2 OTcl/C++分裂模型接口TclCL
- 关于仿ubuntu的IOS界面
- Linux 中的read系统调用到底是阻塞还是非阻塞的
- spring实现远程方法调用