今天帮朋友调代码。他的平衡树在 5×105 量级的随机数据下,树高达到了 2000 以上。原因是他用了一个比较奇怪的插入:
void split(int rt,int&x,int&y,int k){
if(!rt)return (void)(x=y=0);
if(tree[rt].v<k)x=rt,split(tree[x].r,tree[x].r,y,k);
else y=rt,split(tree[y].l,x,tree[y].l,k);
pushup(rt);
}
void _insert(int& rt, int x) {
if (!rt)
rt = x;
else if (tree[x].w > tree[rt].w)
split(rt, tree[x].l, tree[x].r, tree[x].v), rt = x;
else if (tree[x].v < tree[rt].v)
_insert(tree[rt].l, x);
else
_insert(tree[rt].r, x);
pushup(rt);
}
更换为普通 fhq 的 merge 即可维持树平衡。在这里想求助,这种方法是否正确?