NOIP回来就一直想着学平衡树。。。平衡树写久了调不出来真的会头脑发热.jpg

  大概只写了几道题。。。

  fhqtreap是不需要旋转的平衡树,仅使用分裂合并,一样可以保持平衡树的性质,并且可以非常简单地处理区间问题。

  fhqtreap的核心有两段代码,split(分裂)和merge(合并)

  split(x, l, r, k),表示把原x的子树以第k小数为界限,权值<=第k小数的数分在左子树,根为l,其他的分在右子树,根为r

void split(int x, int &l, int &r, int k)
{
    if(!k) l=0, r=x;
    else if(k==tree[x].size) l=x, r=0;
    else if(k<=tree[lt].size) down(r=x), split(lt, l, lt, k), up(x);
    else down(l=x), split(rt, rt, r, k-tree[lt].size-1), up(x);
}
View Code

相关文章: