• Hihocoder 1337 (splay)


    Problem 平衡树 SBT

    题目大意

      维护一个序列,支持两种操作。

      操作一:插入一个数。

      操作二:询问第k小的数。

    解题分析

      ~~刷刷水题,再熟悉一下splay的基本操作。

      ps:哇咔咔,有连续四天的假期了,好开心~~

    参考程序

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 struct node{
     5     int v,sz;
     6     node *l,*r,*f;
     7     node(int v_=0,int sz_=0,node* f_=NULL,node* l_=NULL,node* r_=NULL)
     8     {
     9         v=v_; sz=sz_; l=l_; r=r_; f=f_;
    10     }
    11 }*rt;
    12 
    13 inline void pushup(node *x)
    14 {
    15     x->sz=1;
    16     if (x->l) x->sz += x->l->sz;
    17     if (x->r) x->sz += x->r->sz;
    18 }
    19 void left(node* x,node* &rt)
    20 {
    21     node *y=x->f , *z=y->f;
    22     if (y==rt) rt=x; else
    23         if (y==z->l) z->l=x; else z->r=x;
    24     x->f=y->f; y->f=x; if (x->l) x->l->f=y; y->r=x->l; x->l=y;
    25     pushup(y); pushup(x); 
    26 }
    27 void right(node* x,node* &rt)
    28 {
    29     node *y=x->f , *z=y->f;
    30     if (y==rt) rt=x; else
    31         if (y==z->l) z->l=x; else z->r=x;
    32     x->f=y->f; y->f=x; if (x->r) x->r->f=y; y->l=x->r; x->r=y;
    33     pushup(y); pushup(x); 
    34 }
    35 void splay(node* x,node* &rt)
    36 {
    37     while (x!=rt)
    38     {
    39         node *y=x->f , *z=y->f;
    40         if (y==rt)
    41             if (x == y->l) right(x,rt); else left(x,rt);
    42         else
    43             if (y == z->l) 
    44                 if (x == y->l) {right(y,rt);right(x,rt);}
    45                     else {left(x,rt);right(x,rt);}
    46             else
    47                 if (x == y->r) {left(y,rt);left(x,rt);}
    48                     else {right(x,rt);left(x,rt);} 
    49     }
    50 }
    51 
    52 void insert(int v,node* &x,node* f)
    53 {
    54     if (x==NULL)
    55     {
    56         x=new node(v,1,f);
    57         splay(x,rt);
    58         return;
    59     }
    60     if (v < x->v) insert(v,x->l,x); else insert(v,x->r,x);
    61 }
    62 
    63 int query(int k,node *x)
    64 {
    65     int num=x->l?x->l->sz:0;
    66     if (k==num+1) return x->v;
    67     if (k<num+1) return query(k,x->l);
    68     return query(k-num-1,x->r); 
    69 }
    70 void search(node *x)
    71 {
    72     if (x==NULL) return;
    73     cout<<x->v<<" "<<x->sz;
    74     if (x->l) cout<<" lson:"<<x->l->v;
    75     if (x->r) cout<<" rson:"<<x->r->v;
    76     cout<<endl;
    77     if (x->l) search(x->l);
    78     if (x->r) search(x->r);
    79 
    80 }
    81 int main()
    82 {
    83     int n;
    84     rt=NULL;
    85     scanf("%d",&n);
    86     for (int i=1;i<=n;i++)
    87     {
    88         //search(rt);
    89         char s[3]; int x;
    90         scanf("%s%d",s,&x);
    91         if (s[0]=='I') insert(x,rt,NULL); else cout<<query(x,rt)<<endl;
    92     }
    93 }
    View Code
  • 相关阅读:
    implementaion bottle session with beaker
    [梦]20050802
    网站更新部署20100912
    Cherokee不值得推荐,你还是可以看一看
    最简单方法远程调试Python多进程子程序
    nginx相关的问题
    本地配置host解析的问题
    base target问题,
    在asp.net中自动合并小图片并使用css sprite显示出来
    html编辑器
  • 原文地址:https://www.cnblogs.com/rpSebastian/p/6778072.html
Copyright © 2020-2023  润新知