您的位置:首页 > 其它

BZOJ 3224: Tyvj 1728 普通平衡树(BST)

2015-04-04 16:50 316 查看


treap,算是模板题了...我中间还一次交错题...

--------------------------------------------------------------------

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<cstdlib> #define rep(i,n) for(int i=0;i<n;++i)#define clr(x,c) memset(x,c,sizeof(x)) using namespace std; const int inf=1e9;const int maxn=100000+5; struct Node { Node *ch[2]; int r; int v; int s; Node(int v=0):v(v) { ch[0]=ch[1]=NULL; r=rand(); s=1; } int cmp(int x) const { if(x==v) return -1; return x<v ? 0 : 1; } void maintain() { s=1; if(ch[0]!=NULL) s+=ch[0]->s; if(ch[1]!=NULL) s+=ch[1]->s; }}; void rotate(Node* &o,int d) { Node* k=o->ch[d^1]; o->ch[d^1]=k->ch[d]; k->ch[d]=o; o->maintain(); k->maintain(); o=k;} void insert(Node* &o,int x) { if(o==NULL) o=new Node(x); else { int d=(x<o->v ? 0 : 1); insert(o->ch[d],x); if(o->ch[d]->r > o->r) rotate(o,d^1); } o->maintain();} Node* find(Node* o,int x) { if(o==NULL) return NULL; if(x==o->v) return o; return x<o->v ? find(o->ch[0],x) : find(o->ch[1],x);} void remove(Node* &o,int x) { int d=o->cmp(x); if(d==-1) { Node* k=o; if(o->ch[0]!=NULL && o->ch[1]!=NULL) { int d2=(o->ch[0]->r > o->ch[1]->r ? 1 : 0); rotate(o,d2); remove(o->ch[d2],x); } else { if(o->ch[0]==NULL) o=o->ch[1]; else o=o->ch[0]; delete k; } } else remove(o->ch[d],x); if(o!=NULL) o->maintain();} int rank(Node* o,int x) { if(o==NULL) return 1; if(x<=o->v) return rank(o->ch[0],x); return rank(o->ch[1],x)+(o->ch[0]==NULL ? 0 : o->ch[0]->s)+1;} int kth(Node* o,int k) { if(o==NULL || k<=0 || k>o->s) return 0; int s=(o->ch[0]==NULL ? 0 : o->ch[0]->s); if(k==s+1) return o->v; else if(k<=s) return kth(o->ch[0],k); else return kth(o->ch[1],k-s-1);} int pred(Node* o,int x) { int ans=-inf; while(o!=NULL) { int d=(x>=o->v ? 1 : 0); if(d) ans=max(ans,o->v); o=o->ch[d]; } return ans;} int succ(Node* o,int x) { int ans=inf; while(o!=NULL) { int d=(x<=o->v ? 0 : 1); if(!d) ans=min(ans,o->v); o=o->ch[d]; } return ans;} int main(){// freopen("test.in","r",stdin); Node* root=new Node(inf); int n,t; scanf("%d",&n); while(n--) { int a,b; scanf("%d%d",&a,&b); switch(a) { case 1 : insert(root,b); break; case 2 : if(find(root,b)!=NULL) remove(root,b); break; case 3 : printf("%d\n",rank(root,b)); break; case 4 : printf("%d\n",kth(root,b)); break; case 5 : printf("%d\n",pred(root,b-1)); break; case 6 : printf("%d\n",succ(root,b+1)); break; default: break; } } return 0;}

--------------------------------------------------------------------

3224: Tyvj 1728 普通平衡树

Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 3328 Solved: 1349
[Submit][Status][Discuss]

Description

您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:
1. 插入x数
2. 删除x数(若有多个相同的数,因只删除一个)
3. 查询x数的排名(若有多个相同的数,因输出最小的排名)
4. 查询排名为x的数
5. 求x的前驱(前驱定义为小于x,且最大的数)
6. 求x的后继(后继定义为大于x,且最小的数)

Input

第一行为n,表示操作的个数,下面n行每行有两个数opt和x,opt表示操作的序号(1<=opt<=6)

Output

对于操作3,4,5,6每行输出一个数,表示对应答案

Sample Input

10
1 106465
4 1
1 317721
1 460929
1 644985
1 84185
1 89851
6 81968
1 492737
5 493598
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: