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); }