[Splay模版1]

输入

第1行:1个正整数n,表示操作数量,100≤n≤200,000
第2..n+1行:可能包含下面3种规则:
1个字母'I',紧接着1个数字k,表示插入一个数字k到树中,1≤k≤1,000,000,000,保证每个k都不相同
1个字母'Q',紧接着1个数字k。表示询问树中不超过k的最大数字
1个字母'D',紧接着2个数字a,b,表示删除树中在区间[a,b]的数。

输出

若干行:每行1个整数,表示针对询问的回答,保证一定有合法的解

样例输入

6 I 1 I 2 I 3 Q 4 D 2 2 Q 2

样例输出

3 1
 

Splay模版

注意在平衡树中要加入INF 和 -INF 避免找不到比L小的数和比R大的数

细节在代码中:

 

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<algorithm>
  4 #include<cstdlib>
  5 #include<cmath>
  6 #include<cstring>
  7 #include<ctime>
  8 using namespace std;
  9 const int N=200005,INF=1000000001;
 10 struct node
 11 {
 12     node *child[2],*fa;
 13     int x;
 14 }a[N];
 15 node *pos=a,*root;
 16 void newnode(node *&r,int key,node *&fa)
 17 {
 18     r=pos++;
 19     r->child[0]=r->child[1]=NULL;
 20     r->x=key;r->fa=fa;
 21 }
 22 
 23 void insert(node *&r,int key,node *fa)
 24 {
 25     if(r==NULL){
 26         newnode(r,key,fa);
 27         return ;
 28     }
 29     insert(r->child[key>r->x],key,r);
 30 }
 31 node *pre,*nxt;
 32 void rotate(node *&r,bool t)//0left 1right 
 33 {
 34     node *y=r->fa;
 35     y->child[!t]=r->child[t];
 36     if(r->child[t])r->child[t]->fa=y;
 37     if(y->fa)y->fa->child[y->fa->child[1]==y]=r;
 38     r->fa=y->fa;
 39     r->child[t]=y;
 40     y->fa=r;
 41 }
 42 void check(node *r)//输出整个SPLAY 
 43 {
 44     if(r==NULL)return ;
 45     printf("x=%d lchild=%d rchild=%d\n",r->x,(r->child[0]==NULL?NULL:r->child[0]->x),r->child[1]==NULL?NULL:r->child[1]->x);
 46     check(r->child[0]);
 47     check(r->child[1]);
 48 }
 49 void getpre(node *r,int key)
 50 {
 51     if(r==NULL)return ;
 52     if(key<=r->x)getpre(r->child[0],key);
 53     else pre=r,getpre(r->child[1],key);
 54 }
 55 void getnext(node *r,int key)
 56 {
 57     if(r==NULL)return ;
 58     if(key>=r->x)getnext(r->child[1],key);
 59     else nxt=r,getnext(r->child[0],key);
 60 }
 61 void getans(node *r,int key)
 62 {
 63     if(r==NULL)return ;
 64     if(key<r->x)getans(r->child[0],key);//注意这里key<r->x不能取等 
 65     else pre=r,getans(r->child[1],key);
 66 }
 67 void splay(node *r,node *g)
 68 {
 69     while(r->fa!=g)
 70     {
 71         if(r->fa->fa==g)rotate(r,r->fa->child[0]==r);
 72         else{
 73             node *y=r->fa;
 74             bool b=y->fa->child[0]==y;
 75             if(y->child[b]==r)rotate(r,!b);
 76             else rotate(y,b);
 77             rotate(r,b);
 78         } 
 79     }
 80     if(g==NULL)root=r;
 81 }
 82 
 83 void work(int l,int r)
 84 {
 85     getpre(root,l);getnext(root,r);
 86     splay(pre,NULL);
 87     splay(nxt,pre);
 88     root->child[1]->child[0]=NULL;
 89 }
 90 void haha()//**********插入INF 和 -INF 避免找不到小于l和大于r的数************* 
 91 {
 92     insert(root,INF,NULL);insert(root,-INF,NULL);
 93     return ;
 94 }
 95 int main()
 96 {
 97     haha();
 98     int n,x,y;char ch;
 99     scanf("%d",&n);
100     while(n--)
101     {
102         scanf("\n%c%d",&ch,&x);
103         if(ch=='I'){
104             insert(root,x,NULL);
105         }
106         if(ch=='Q'){
107             getans(root,x);
108             printf("%d\n",pre->x);
109         }
110         if(ch=='D'){
111             scanf("%d",&y);
112             work(x,y);
113         }
114     }
115 }

 

 

 

posted @ 2017-04-25 16:21  PIPIBoss  阅读(189)  评论(0编辑  收藏  举报