用这个题来练习了下SBT,感觉有点奇怪,set居然还快些,没搞懂 学sbt可以看陈启峰的论文http://wenku.baidu.com/view/364afa42a8956bec0975e3b1.html 还是中文的,很简单 /* * File: main.cpp * Author: Mi * * Created on 2011年4月13日, 下午3:38 */ #include <cstdlib> #include <stdio.h> #include <string.h> #include <algorithm> #define N 1000005 using namespace std; /* * */ int tol; struct SBT { int left,right; int key; int num; int s; void init() { left=0,right=0; s=1; key=0; num=0; } }T[N]; void R_Rotate(int &t) { int k=T[t].left; T[t].left=T[k].right; T[k].right=t; T[k].s=T[t].s; T[t].s=T[T[t].left].s+T[T[t].right].s+1; t=k; return ; } void L_Rotate(int &t) { int k=T[t].right; T[t].right=T[k].left; T[k].left=t; T[k].s=T[t].s; T[t].s=T[T[t].left].s+T[T[t].right].s+1; t=k; return ; } void Maintain(int &t,bool flag) { if(flag==false) { if(T[T[T[t].left].left].s>T[T[t].right].s) R_Rotate(t); else if(T[T[T[t].left].right].s>T[T[t].right].s) { L_Rotate(T[t].left); R_Rotate(t); } else return ; } else { if(T[T[T[t].right].right].s>T[T[t].left].s) L_Rotate(t); else if(T[T[T[t].right].left].s>T[T[t].left].s) { R_Rotate(T[t].right); L_Rotate(t); } else return ; } Maintain(T[t].left,false); Maintain(T[t].right,true); Maintain(t,false); Maintain(t,true); } void Insert(int &t,int v,int num) { if(t==0) { t=++tol; T[t].init(); T[t].key=v; T[t].num=num; } else { T[t].s++; if(v<T[t].key) Insert(T[t].left,v,num); else Insert(T[t].right,v,num); Maintain(t,v>=T[t].key); } } int Delete(int &t,int v) { if(!t) return 0; T[t].s--; if(v==T[t].key||v<T[t].key&&!T[t].left||v>T[t].key&&!T[t].right) { if(T[t].left&&T[t].right) { int p=Delete(T[t].left,v+1); T[t].key=T[p].key; return p; } else { int p=t; t=T[t].left+T[t].right; return p; } } else return Delete(v<T[t].key?T[t].left:T[t].right,v); } int Getmax(int t) { while(T[t].right) t=T[t].right; return t; } int Getmin(int t) { while(T[t].left) t=T[t].left; return t; } int main(int argc, char** argv) { int n,root=0; tol=0; while(scanf("%d",&n),n) { if(n==1) { int k,p; scanf("%d%d",&k,&p); Insert(root,p,k); } else if(n==2) { if(tol==0) puts("0"); else { int ans=Getmax(root); printf("%d/n",T[ans].num); Delete(root,T[ans].key); } } else { if(tol==0) puts("0"); else { int ans=Getmin(root); printf("%d/n",T[ans].num); Delete(root,T[ans].key); } } } return 0; }