| ||||||||||
Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
优美的splay#include<cstdio> #include<iostream> #define cp freopen #define Node node* #define MAX 1000010 #define inf (MAX*99) #define rep(i,a,b) for (int i=a;i<=b;i++) using namespace std; class splay { struct node { int k,v,s; bool d; node *c[2],*p; void sc(node *_c,bool d) { c[d]=_c; _c->p=this; _c->d=d; } }*root,*null,*stack[MAX],*now,data[MAX],*tmp; int top; Node new_node(int k,int v) { if (top) tmp=stack[top--]; else tmp=now++; tmp->k=k; tmp->v=v; tmp->s=1; tmp->c[0]=tmp->c[1]=null; return tmp; } void del_node(Node c) { stack[++top]=c; } Node insert(int v,int k) { for(Node t=root;t->k!=k;) { int d=k>t->k; if (t->c[d]==null) { Node p=new_node(k,v); t->sc(p,d); upd(t); return t; } t=t->c[d]; } } Node select(int k) { for(Node t=root->c[1];;) { int r=t->c[0]->s; if (r==k) return t; t=t->c[k>r]; if (k>r) k-=r+1; } } Node Delete(Node k) { Node t; Node p=find(k->k); while (p->c[0]!=null) rot(p->c[0]); if (p->c[1]!=null) { p->p->sc(p->c[1],p->d); t=p->c[1]; } else { p->p->c[p->d]=null; t=p->p; } upd(p->p); del_node(p); return t; } void upd(Node x) { x->s=x->c[1]->s+x->c[0]->s+1; } void rot(Node x) { Node p=x->p; int d=x->d; p->p->sc(x,p->d); p->sc(x->c[!d],d); x->sc(p,!d); upd(p); upd(x); } void spl(Node x,Node f) { while (x->p!=f) { if (x->p->p==f) rot(x); else if (x->d==x->p->d) rot(x->p),rot(x); else rot(x),rot(x); } } public: int all; splay() { top=all=0; now=data; null=new_node(0,0); null->s=0; root=new_node(-inf,0); root->p=root; } Node find(int x) { Node t=root->c[1]; while (t!=null&&t->k!=x) t=t->c[x>t->k]; return t; } void ins(int v,int k) { Node p=insert(v,k); spl(p,root); all++; } void del(Node p) { Node t=Delete(p); spl(t,root); } void sel(int x) { if (x==0) { cout<<0<<endl; return; } Node p=select(x-1); del(p); cout<<p->v<<endl; all--; } }*sp; int main() { cp("1.in","r",stdin); cp("1.out","w",stdout); int k; sp=new splay; while (scanf("%d",&k)!=EOF) { if (k==0) break; if (k==1) { int x,y; scanf("%d %d",&x,&y); sp->ins(x,y); } if (k==2) sp->sel(sp->all); if (k==3) sp->sel(1); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator