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 大神似乎有更高明的做法)

    等待完坑

  • 相关阅读:
    ural(Timus) 1019 Line Painting
    ACMICPC Live Archive 2031 Dance Dance Revolution
    poj 3321 Apple Tree
    其他OJ 树型DP 选课
    poj 3548 Restoring the digits
    ACMICPC Live Archive 3031 Cable TV Network
    递归循环获取指定节点下面的所有子节点
    手动触发asp.net页面验证控件事件
    子级Repeater获取父级Repeater绑定项的值
    没有列名的数据绑定
  • 原文地址:https://www.cnblogs.com/dyllalala/p/3901500.html
Copyright © 2011-2022 走看看