• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            巢穴

            about:blank

            NOI2004 cashier

            treap..
            有幾個(gè)地方寫的很尷尬...
            其實(shí)我沒寫過平衡樹...任何的平衡樹..
            所以我就把對(duì)于size的維護(hù)寫錯(cuò)了..orz..
            然后我又把砍掉一棵子樹那部分寫錯(cuò)了..
            我感覺這樣砍樹是會(huì)造成一定的不平衡的..
            但不平衡會(huì)很小.
            呃..其實(shí)也不能這么說..
            應(yīng)該說..會(huì)造成不平衡..
            但這個(gè)不平衡帶給我的負(fù)擔(dān)不會(huì)高于我曾經(jīng)的負(fù)擔(dān)..orz..貌似是這樣
            #include <iostream>
            #include 
            <fstream>
            #include 
            <stdio.h>
            using namespace std;

            #define RANK_L(x) ((x)->left==NULL?0:(x)->left->size)
            #define RANK_R(x) ((x)->right==NULL?0:(x)->right->size)
            ifstream fin(
            "cashier.in");
            ofstream fout(
            "cashier.out");
            int delta=0,leave=0
            const int MAXN=100001;
            int num=0;
            struct node
            {
             
            int father,size,value,ran;
             node  
            *left,*right;
            }
             *root,tree[MAXN+1];


            int n,m_in;
            int len=0;
            int _count=0;
            /*
              a          
             / \
            c   b
               / \
               d  e
               
               
            */

            void RotateLeft(node* &x)
            {
                 node 
            *z=x->right;
                 z
            ->size=x->size;
                 x
            ->right=z->left;
                 z
            ->left=x;    
                 x
            ->size=RANK_L(x)+RANK_R(x)+1;
                 x
            =z;     
            }

            void RotateRight(node* &x)
            {
                 node 
            *z=x->left;
                 z
            ->size=x->size;
                 x
            ->left=z->right;
                 z
            ->right=x;    
                 x
            ->size=RANK_R(x)+RANK_L(x)+1;
                 x
            =z;
            }

            void insert(node *&x,int k)
            {
             
            if (x==NULL)
             
            {
              node 
            *p=&tree[len++];
              p
            ->value=k;
              p
            ->ran=rand()*rand();
              p
            ->size=1;
              p
            ->left=NULL;
              p
            ->right=NULL;
              x
            =p;
              
            return;
             }

               x
            ->size++;
             
            if (k>=x->value) 
             
            {
              insert(x
            ->right,k);
              
            if (x->right->ran>x->ran) RotateLeft(x);
             }

             
            else
             
            {
              insert(x
            ->left,k);
              
            if (x->left->ran>x->ran) RotateRight(x);
             }

            }



            int _delete(node *&x)
            {
              
            int v=0,t=0;
              
            if (x==NULL) return 0;
              
            if (x->value+delta<m_in)
              
            {
               v
            +=RANK_L(x)+1;
               x
            ->size-=v;
               x
            ->left=NULL;
               t
            =_delete(x->right);
               v
            +=t;
               x
            ->size-=t;
               
            if (x->right!=NULL) x->right->size=x->size; 
               x
            =x->right;
              }

              
            else
              
            {
               t
            =_delete(x->left);
               v
            =t;
               x
            ->size-=t;
              }

              
            return v;
            }

            int find(node *x,int k)
            {
                
            if (x==NULL) return 0;
                
            if (k==RANK_R(x)+1return x->value;
                
            if (k>RANK_R(x)) return find(x->left,k-RANK_R(x)-1);
                
            else
                    
            return find(x->right,k);
            }

            int total;
            int main()
            {
                root
            =NULL; 
                fin
            >>n>>m_in;
                
            for (int i=1;i<=n;i++)
                
            {
                    
            char c,ch;
                    
            int k;
                    fin
            >>c>>k;
                    
            switch(c)
                    
            {
                     
            case 'I':if (k>=m_in) {total++;insert(root,k-delta);}break;
                     
            case 'A':delta+=k;break;
                     
            case 'S':delta-=k;_count=_delete(root);num+=_count;break;
                     
            case 'F':if (k>total-num) fout<<-1<<endl; else fout<<find(root,k)+delta<<endl;break;
                     
            default:break;
                    }

                }

                fout
            <<num<<endl;
                
            return 0;
            }

            posted on 2009-10-13 11:27 Vincent 閱讀(252) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 數(shù)據(jù)結(jié)構(gòu)與算法

            久久精品国产精品亚洲艾草网美妙| 色婷婷噜噜久久国产精品12p | 九九久久99综合一区二区| 99久久精品九九亚洲精品| 伊人久久大香线蕉精品不卡| 久久精品国产久精国产思思| 久久精品无码一区二区三区免费 | 久久男人AV资源网站| 日本强好片久久久久久AAA| 久久精品国产精品亚洲人人 | 91精品国产色综久久| 亚洲va中文字幕无码久久不卡| 精品无码久久久久久久动漫| 久久婷婷五月综合国产尤物app| 久久天天躁狠狠躁夜夜av浪潮 | 国产福利电影一区二区三区久久老子无码午夜伦不 | 很黄很污的网站久久mimi色| 久久A级毛片免费观看| 中文精品久久久久人妻| 久久国产热这里只有精品| 久久99国产精一区二区三区| 亚洲AV无码久久寂寞少妇| 亚洲欧美一级久久精品| 久久成人国产精品一区二区| 久久久久国产一级毛片高清版| 欧美亚洲色综久久精品国产| 久久国产精品无| 国产精品内射久久久久欢欢| 国内精品久久久久| 久久99精品国产99久久| 狠狠色丁香婷婷综合久久来 | 国产毛片欧美毛片久久久| 亚洲精品国精品久久99热| 看全色黄大色大片免费久久久| 久久精品国产亚洲精品| 久久久精品日本一区二区三区| 久久精品国产精品亚洲人人| 伊人伊成久久人综合网777| 久久99热这里只有精品66| 久久精品中文无码资源站| 中文精品久久久久人妻不卡|