Logo caxx_shaozenan的博客

博客

标签
暂无

FHQ_Treap 模板自取

2024-03-24 19:49:34 By caxx_shaozenan
const int MAXN=100005;
struct Node {
    int lsn,rsn;     // 左右儿子 
    int key,pri,siz; // 键值,优先级,字数大小 
};
int tSize,root,n;
Node treap[MAXN];
void makeNewNode(int x) { // 建新节点 
    ++tSize;
    treap[tSize].siz=1;
    treap[tSize].lsn=treap[tSize].rsn=0;
    treap[tSize].key=x;
    treap[tSize].pri=rand();
    return ;
}
void updateRoot(int u) { // 更新子树大小 
    treap[u].siz=treap[treap[u].lsn].siz+treap[treap[u].rsn].siz+1;
    return ;
}
void split(int u,int x,int &L,int &R) { // 我裂开了 
    if(u==0) {
        L=R=0;
        return ;
    }
    if(treap[u].key<=x) {
        L=u; split(treap[u].rsn,x,treap[u].rsn,R);
        // 根小于分裂的值,左边不考虑,向右边分裂 
    }
    else {
        R=u; split(treap[u].lsn,x,L,treap[u].lsn);
        // 根大于等于分裂的值,右边不考虑,向左边分裂 
    }
    updateRoot(u);
    return ;
}
int merge(int L,int R) { // 合并 
    if(L==0||R==0) return L+R;
    if(treap[L].pri>treap[R].pri) {
        treap[L].rsn=merge(treap[L].rsn,R);
        updateRoot(__1__);
        return L;
    }
    treap[R].lsn=merge(L,treap[R].lsn);
    updateRoot(__2__);
    return R;
}
int insert(int x) { // 插入数值 x 
    int L,R;
    split(root,x,L,R);
    makeNewNode(x);
    root=merge(merge(L,tSize),R);
    return tSize;
}
int delNum(int x) { // 删除所有 x 值的节点 
    int L,M,R;
    split(root,x,L,R);
    split(L,x-1,L,M);
    M=merge(treap[M].lsn,treap[M].rsn);
    root=merge(merge(L,M),R);
    return root;
}
int getRank(int x) { // 获取 x 值的排名 
    int L,R,res;
    split(root,x-1,L,R);
    res=treap[L].siz+1;
    root=merge(L,R);
    return res;
}
int kth(int u,int k) { // 获取排名为 k 的值 
    if(k==treap[treap[u].lsn].siz+1) return u;
    if(k<=treap[treap[u].lsn].siz) return kth(treap[u].lsn,k);
    return kth(treap[u].rsn,k-treap[treap[u].lsn].siz-1);
}
int precursor(int x) { // 获取 x 值的前驱 
    int L,R,res;
    split(root,x-1,L,R);
    res=treap[kth(L,treap[L].siz)].key;
    root=merge(L,R);
    return res;
}
int successor(int x) { // 获取 x 值的后继 
    int L,R,res;
    split(root,x,L,R);
    res=treap[kth(R,1)].key;
    root=merge(L,R);
    return res;
}

可免费试用。

共 1 篇博客