求助 FHQ Treap 的 merge
  • 板块学术版
  • 楼主ccccccyd
  • 当前回复8
  • 已保存回复8
  • 发布时间2024/10/31 07:51
  • 上次更新2024/10/31 15:34:34
查看原帖
求助 FHQ Treap 的 merge
428993
ccccccyd楼主2024/10/31 07:51

FHQ Treap 通过给每个节点随机赋 dat,构造按 dat 是小根堆,按 x(值)是二叉搜索树的方式平衡

于是代码这么写

int merge(int x,int y){// x y 是两棵值域不相交的树,保证 x<y
    if(!x||!y) return x+y;
    push(x),push(y);
    if(tr[x].dat<tr[y].dat){
        tr[x].r=merge(tr[x].r,y);
        return x;
    }else{
        tr[y].l=merge(x,tr[y].l);
        return y;
    }
}

但是我的一份代码中,换了个方式维护合并。

int merge(int x,int y){// x y 是两棵值域不相交的树,不保证 x<y
    if(!x||!y) return get_fa(x+y),x+y;
    push(x),push(y);
    if(tr[x].dat>tr[y].dat) swap(x,y);
    if(tr[x].x<tr[y].x) tr[x].r=merge(tr[x].r,y);
    else tr[x].l=merge(tr[x].l,y);
    return x;
}

然后TLE了

但是这个做法不同样保证了按 dat 是小根堆的性质吗,是代码写假了,还是 FHQ Treap 的复杂度证明另有玄机?

2024/10/31 07:51
加载中...