zoukankan      html  css  js  c++  java
  • [那些你所不知道的鬼畜写法]平衡树学习笔记

    treap:  (Orz fhq 大神,我曾经以为我会了 treap ,就再也不会写 splay 了,然后我遇上了 lct )

     1 #include <cstdlib>
     2 const int sizeOfMemory=10000;
     3 template <class type> inline void swap(type & x, type & y) {type t=x; x=y; y=t;}
     4 
     5 namespace treap
     6 {
     7     struct node
     8     {
     9         int key, size;
    10         short weight;
    11         bool rev;
    12         node * left, * right;
    13         inline node():size(1), weight(0) {left=right=this;}
    14         inline void maintain() {size=left->size+right->size+1;}
    15         inline void pushdown() {if (rev) swap(left, right), left->rev^=1, right->rev^=1, rev=0;}
    16     };
    17     node * null=new node();
    18     node memory[sizeOfMemory], * portOfMemory=memory;
    19 
    20     inline node * newnode(int key)
    21     {
    22         node * ret=portOfMemory++;
    23         ret->key=key; ret->size=1;
    24         ret->weight=rand();
    25         ret->rev=0;
    26         ret->left=ret->right=null;
    27         return ret;
    28     }
    29     void splitBySize(node * t, int k, node *& l, node *& r)
    30     {
    31         if (t==null) l=r=null;
    32         else
    33         {
    34             t->pushdown();
    35             if (t->left->size<k)
    36             {
    37                 l=t;
    38                 splitBySize(t->right, k-t->left->size-1, t->right, r);
    39                 l->maintain();
    40             }
    41             else
    42             {
    43                 r=t;
    44                 splitBySize(t->left, k, l, t->left);
    45                 r->maintain();
    46             }
    47         }
    48     }
    49     void splitByKey(node * t, int k, node *& l, node *& r)
    50     {
    51         if (t==null) l=r=null;
    52         else
    53         {
    54             t->pushdown();
    55             if (t->key<k)
    56             {
    57                 l=t;
    58                 splitByKey(t->right, k, t->right, r);
    59                 l->maintain();
    60             }
    61             else
    62             {
    63                 r=t;
    64                 splitByKey(t->left, k, l, t->left);
    65                 r->maintain();
    66             }
    67         }
    68     }
    69     node * merge(node * l, node * r)
    70     {
    71         if (l==null) return r;
    72         if (r==null) return l;
    73         if (l->weight>r->weight)
    74         {
    75             l->pushdown();
    76             l->right=merge(l->right, r);
    77             l->maintain();
    78             return l;
    79         }
    80         else
    81         {
    82             r->pushdown();
    83             r->left=merge(l, r->left);
    84             r->maintain();
    85             return r;
    86         }
    87     }
    88 }
    本傻装B系列

    splay:  (我曾经以为我会了 treap ,就再也不会在 lct 外的地方写 splay 了,然后我遇上了 自顶向下 splay )

    等待完坑

    AVL:  ( fhq 大神 说是为了解决人工实现 rope 时,treap 不能直接复制节点否则权重会痿掉的问题而搞出来的新产物,但 clj 大神似乎有更高明的做法)

    等待完坑

  • 相关阅读:
    读《构建之法》阅读与思考
    软工沉浮沉沉沉沉沉沉…记事
    四则运算截图and代码
    2016012000郭慕然+散列函数的应用及其安全性
    结对作业之四则运算网页版
    阅读《构建执法》第四章及第十七章有感
    2016012000小学四则运算练习软件项目报告
    有关读《构建之法》的部分思考与疑问
    遇见·软件
    我的——今日学习内容
  • 原文地址:https://www.cnblogs.com/dyllalala/p/3901500.html
Copyright © 2011-2022 走看看