P6136 【模板】普通平衡树(数据加强版)
题意:
1,插入一个数;
2,删除一个数
3,查询一个数的排名
4,查询第x个数
5,查询x的前驱和后继
重点在于分裂split和合并merge操作:
1:分裂为X[0,x],Y[x+1,n],后rt=merge(X,x,Y)
2:分裂为X[0,x-1],Y[x,x],Z[x+1,n] 后Y=merge(Y.l,Y.r),后rt=merge(X,Y,Z);
3:分裂为X[0,x-1],Y[x,n] ans=tr[X].size+1; 后rt=merge(X,Y);
4:p=rt,若tr[tr[p].l].size+1==x p为答案 若tr[tr[p].l].size>=x,则p=tr[p].l,不然x-=tr[tr[p].l].size+1,p=tr[p].r;
5:前驱 :分裂为X[0,x-1],Y[x,n],然后p=X 不断向右寻找。后继同理
P3391 【模板】文艺平衡树
题意:给定一个有序数列,每次对数列的一段区间进行反转操作
对一段数进行反转相当于对一棵树进行反转(再中序遍历下),利用FHQ Treap,每次将一颗树拆开[0,l-1],[l,r],[r+1,n]的三部分,对[l,r]进行反转。注意要打懒标记,不然复杂度过高。