题目描述:给出一些操作查找序列里的最大最小值。
还是用SBT做的,其实平衡树很好用,效率也高,代码长一点全当作是锻炼代码能力吧。
-
#include "stdio.h" #include "string.h" #include "stdlib.h" const int N=50005; const int M=1000005;
-
struct Node { int k; int prio; int size; struct Node *l,*r; }*root,tree[M]; int tot; int n,m;
-
void init() { tot=0; root=NULL; }
-
int ls(Node *p) { return p->l?p->l->size:0; }
-
int rs(Node *p) { return p->r?p->r->size:0; }
-
void rotate_left(Node* &p) { Node *q=p->r; p->r=q->l; q->l=p; q->size=p->size; p->size=ls(p)+rs(p)+1; p=q; }
-
void rotate_right(Node* &p) { Node *q=p->l; p->l=q->r; q->r=p; q->size=p->size; p->size=ls(p)+rs(p)+1; p=q; }
-
void maintain(Node* &p,bool flag) { if(flag) { if(p->r && p->r->r && p->r->r->size>ls(p)) rotate_left(p); else if(p->r && p->r->l && p->r->l->size>ls(p)) { rotate_right(p->r); rotate_left(p); } } else { if(p->l && p->l->l && p->l->l->size>rs(p)) rotate_right(p); else if(p->l && p->l->r && p->l->r->size>rs(p)) { rotate_left(p->l); rotate_right(p); } } }
-
void insert(int k,int prio,Node* &p) { if(!p) { p=&tree[tot++]; p->l=NULL; p->r=NULL; p->size=1; p->k=k; p->prio=prio; } else { p->size++; if(p->prio>prio) insert(k,prio,p->l); else insert(k,prio,p->r); maintain(p,prio>=p->prio); } }
-
int getmax(int &prio,Node *p) { if(!p) return 0; while(p->r) p=p->r; prio=p->prio; return p->k; }
-
int getmin(int &prio,Node *p) { if(!p) return 0; while(p->l) p=p->l; prio=p->prio; return p->k; }
-
void delet(int prio,Node* &p) { if(!p) return ; p->size--; if(prio<p->prio) delet(prio,p->l); else if(prio>p->prio) delet(prio,p->r); else { if(!p->l && !p->r) p=NULL; else if(!p->l) p=p->r; else if(!p->r) p=p->l; else { Node *q; q=p->r; while(q->l) q=q->l; p->prio=q->prio; delet(q->prio,p->r); } } }
-
int main() { init(); while(scanf("%d",&n)==1) { if(!n) break; if(n==1) { int k,p; scanf("%d%d",&k,&p); insert(k,p,root); } else if(n==2) { int k,p; k=getmax(p,root); if(!k) printf("0/n"); else { printf("%d/n",k); delet(p,root); } } else { int k,p; k=getmin(p,root); if(!k) printf("0/n"); else { printf("%d/n",k); delet(p,root); } } } return 0; }