树套树
名字看上去很高端很酷炫,其实不难,说白了就是树上建树。什么是树上建树?比如一个区间【1,5】,那么建成线段树就有【1,5】【1,3】【4,5】【1,2】【3】【4】【5】【1】【2】这么多个节点,现在我们把这个节点都变成一棵树(平衡树或者线段数),然后把区间内每个点都上入这个平衡树中,比如【1,3】,那么我们就把【1,3】里面三个数都加到一棵平衡树中,这样就可以直接得到【1,3】中每个树的排名(或者一些其他的工作)。
由于treap各种短各种方便,bit各种短各种方便,线段树各种快各种常数小(对于平衡树来说,而且此时线段树多是权值线段数)。so,蒟蒻至今只写过bit套treap,bit套线段树。
1、线段数套treap
建树过程
procedure maketree(x,l,r:longint); var i,mid:longint; begin with tree[x] do begin left:=l; right:=r; root:=0; for i:=l to r do insert(root,num[i]); end; if l=r then exit; mid:=(l+r)>>1; maketree(x<<1,l,mid); maketree(x<<1+1,mid+1,r); end;